gpt4 book ai didi

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

转载 作者:qq735679552 更新时间:2022-09-28 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章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) }),

运行的系统调用 。

复制代码 代码如下:

[pid 25565] execve("/bin/ls", ["/bin/ls", "-l", "."], [/* 16 vars */]

  。

child_process.spawn 。

使用 spawn 替换的例子很相似.

复制代码 代码如下:

var child_process = require('child_process'),

  。

var path = "." var ls = child_process.spawn('/bin/ls', ['-l', path]) ls.stdout.on('data', function (data) {     console.log(data.toString()); }),

  。

运行的系统调用 。

  。

复制代码 代码如下:

[pid 26883] execve("/bin/ls", ["/bin/ls", "-l", "."], [/* 16 vars */

  。

当使用spawn或execfile时,我们的目标是只执行一个命令(参数)。这意味着用户不能运行注入的命令,因为/bin/ls并不知道如何处理反引号或pipe或;。它的/bin/bash将要解释的是那些命令的参数。它类似于使用将参数传入SQL查询(parameter),如果你熟悉的话.

但还需要警告的是:使用spawn或execFile并不总是安全的。例如,运行 /bin/find,并传入用户输入参数仍有可能导致系统被攻陷。 find命令有一些选项,允许读/写任意文件.

所以,这里有一些关于Node.js运行系统命令的指导建议:

避免使用child_process.exec,当需要包含用户输入的参数时更是如此,请牢记。 尽量避免让用户传入参数,使用选择项比让用户直接输入字符串要好得多。 如果你必须允许用户输入参数,请广泛参考该命令的参数,确定哪些选项是安全的,并建立一个白名单.

最后此篇关于Node.js中安全调用系统命令的方法(避免注入安全漏洞)的文章就讲到这里了,如果你想了解更多关于Node.js中安全调用系统命令的方法(避免注入安全漏洞)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com