这篇文章主要介绍了Node.js中安全调用系统命令的方法(避免注入安全漏洞),本文讲解的一般是连接字符串会时出的安全问题情况,需要的朋友可以参考下
在这篇文章中,我们将学习正确使用Node.js调用系统命令的方法,以避免常见的命令行注入漏洞。
我们经常使用的调用命令的方法是最简单的child_process.exec。它有很一个简单的使用模式;通过传入一段字符串命令,并把一个错误或命令处理结果回传至回调函数中。
这里是你通过child_process.exec调用系统命令一个非常典型的例子。
child_process.exec('ls', function (err, data) {
console.log(data);
});
不过,当你需要在你调用的命令中添加一些用户输入的参数时,会发生什么?显而易见的解决方案是把用户输入直接和您的命令进行字符串合并。但是,我多年的经验告诉我:当你将连接的字符串从一个系统发送到另一个系统时,总有一天会出问题。
var path = "user input";
child_process.exec('ls -l ' + path, function (err, data) {
console.log(data);
});
为什么连接字符串会出问题?
嗯,因为在child_process.exec引擎下,将调用执行"/bin/sh"。而不是目标程序。已发送的命令只是被传递给一个新的"/bin/ sh'进程来执行shell。 child_process.exec的名字有一定误导性 - 这是一个bash的解释器,而不是启动一个程序。这意味着,所有的shell字符可能会产生毁灭性的后果,如果直接执行用户输入的参数。
[pid 25170] execve("/bin/sh", ["/bin/sh", "-c", "ls -l user input"], [/* 16 vars */]
比如,攻击者可以使用一个分号";"来结束命令,并开始一个新的调用,他们可以使用反引号或$()来运行子命令。还有很多潜在的滥用。
那么什么是正确的调用方式?
execFile / spawn
像spawn和execFile采用一个额外的数组参数,不是一个shell环境下可以执行其他命令的参数,并不会运行额外的命令。
让我们使用的execFile和spawn修改一下之前的例子,看看系统调用有何不同,以及为什么它不容易受到命令注入。
child_process.execFile
var child_process = require('child_process');
var path = "."
child_process.execFile('/bin/ls', ['-l', path], function (err, result) {
console.log(result)
});
以上就是Node.js中安全调用系统命令的方法(避免注入安全漏洞)的详细内容,更多请关注0133技术站其它相关文章!