方法调用系统命令安全Node.js(避免注入的安全漏洞)

方法调用系统命令安全Node.js(避免注入的安全漏洞)
在这篇文章中,我们将学习如何使用js调用系统命令正确以避免常见的命令行注入漏洞。

我们经常使用的调用命令的方法是最简单的child_process.exec.it有一个非常简单的使用方式;通过在一个字符串命令并返回一个错误或命令的处理结果对回调函数

这里是你调用系统命令通过一个非常典型的例子child_process.exec。

复制代码代码如下所示:

child_process.exec(' ',功能(呃,数据){

console.log(数据);

});
但是,当您需要向您所调用的命令添加一些用户输入参数时,会发生什么情况呢显而易见的解决方案是直接使用命令将用户合并成字符串。然而,我多年的经验告诉我,当你把一个字符串从一个系统发送到另一个系统时,总有一天会有问题。

复制代码代码如下所示:

用户输入;

child_process.exec('我' +路径功能(呃,数据){

console.log(数据);

});
为什么连接字符串会出现问题

嗯,因为child_process.exec引擎下,呼叫将被称为 /斌/ SH。没有目标程序。发送的命令是通过一个新的 /斌/ sh'process执行shell,child_process.exec名字误导-这是一个bash解释器,不是一个计划。这意味着壳牌所有字符可能如果用户的输入参数,直接执行有毁灭性的后果。

复制代码代码如下所示:

{ 25170 } execve(PID /斌/ SH
例如,攻击者可以使用分号 结束命令并启动一个新的调用。他们可以使用子引号或$()来运行子命令,也有很多潜在的滥用。

那么,正确的称呼方式是什么呢

execfile /产卵

喜欢产卵和采取额外execfile数组参数,没有参数,可以在shell环境下执行其他命令,不要运行额外的命令。

让我们用execfile和产卵修改前面的例子中看到的系统调用是不同的,为什么它不容易注入命令。

child_process.execfile

复制代码代码如下所示:

无功child_process =需要('child_process);

var路径

child_process.execfile( /斌/ ls,{L,路径},功能(呃,结果){

console.log(结果)

});
运行系统调用

复制代码代码如下所示:

{ 25565 } execve(PID /斌/ LS
child_process.spawn

菌种更替的例子非常相似。

复制代码代码如下所示:

无功child_process =需要('child_process);

var路径

VaR LS = child_process.spawn( /斌/ ls,{L,路径})

Ls.stdout.on(数据功能(数据){

console.log(data.tostring());

});
运行系统调用

复制代码代码如下所示:

{ 26883 } execve(PID /斌/ LS
使用菌种或execfile时,我们的目标是只有一个命令执行(参数)。这意味着用户不能运行注入的命令,因为 /斌/ LS不知道如何处理反引号或管或;, /斌/ bash将解释这些命令的参数。它类似于将参数传递到SQL查询(参数),如果你熟悉它。

但需要提醒,产卵或execfile的使用并不总是安全的。比如,跑步 /斌/找到并通过用户输入的参数可以使系统被困。find命令有一些选项,允许你读/写任何文件

所以,有一些指导方针在Node.js运行系统命令:

避免使用child_process.exec,记住当你需要的参数,包括用户输入。

尽量避免让用户传递参数,使用选项比允许用户直接输入字符串要好得多。

如果您必须允许用户输入参数,请参考该命令的参数,确定哪些选项是安全的,并建立一个白名单。

免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部