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


Posted in Javascript onDecember 05, 2014

在这篇文章中,我们将学习正确使用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,当需要包含用户输入的参数时更是如此,请牢记。
尽量避免让用户传入参数,使用选择项比让用户直接输入字符串要好得多。
如果你必须允许用户输入参数,请广泛参考该命令的参数,确定哪些选项是安全的,并建立一个白名单。

Javascript 相关文章推荐
jquery如何根据值设置默认的选中项
Mar 17 Javascript
Javascript快速排序算法详解
Dec 03 Javascript
javascript实现当前页导航激活的方法
Feb 27 Javascript
基于JavaScript代码实现自动生成表格
Jun 15 Javascript
JS中的hasOwnProperty()、propertyIsEnumerable()和isPrototypeOf()
Aug 11 Javascript
用JS动态设置CSS样式常见方法小结(推荐)
Nov 10 Javascript
详解ECharts使用心得总结
Dec 06 Javascript
JS实现控制图片显示大小的方法【图片等比例缩放功能】
Feb 18 Javascript
angular4中关于表单的校验示例
Oct 16 Javascript
浅析node Async异步处理模块用例分析及常用方法介绍
Nov 17 Javascript
vue中的watch监听数据变化及watch中各属性的详解
Sep 11 Javascript
基于three.js实现的3D粒子动效实例代码
Apr 09 Javascript
jQuery前端框架easyui使用Dialog时bug处理
Dec 05 #Javascript
Javascript实现获取窗口的大小和位置代码分享
Dec 04 #Javascript
Javascript 中创建自定义对象的方法汇总
Dec 04 #Javascript
dreamweaver 8实现Jquery自动提示
Dec 04 #Javascript
jquery实现动态画圆
Dec 04 #Javascript
javascript数组遍历for与for in区别详解
Dec 04 #Javascript
c#+jquery实现获取radio和checkbox的值
Sep 12 #Javascript
You might like
PHP 采集心得技巧
2009/05/15 PHP
php性能优化分析工具XDebug 大型网站调试工具
2011/05/22 PHP
深入解析PHP垃圾回收机制对内存泄露的处理
2013/06/14 PHP
接收键盘指令的脚本
2006/06/26 Javascript
JavaScript与C# Windows应用程序交互方法
2007/06/29 Javascript
js自执行函数的几种不同写法的比较
2012/08/16 Javascript
js实现拉伸拖动iframe的具体代码
2013/08/03 Javascript
js的正则test,match,exec详细解析
2014/01/29 Javascript
jQuery添加删除DOM元素方法详解
2016/01/18 Javascript
浅谈Emergence.js 检测元素可见性的 js 插件
2017/11/18 Javascript
浅谈在不使用ssr的情况下解决Vue单页面SEO问题(2)
2018/11/08 Javascript
JS实现图片拖拽交换效果
2018/11/30 Javascript
[34:56]Ti4冒泡赛LGD vs Liquid 1
2014/07/14 DOTA
用python实现的可以拷贝或剪切一个文件列表中的所有文件
2009/04/30 Python
python字符串加密解密的三种方法分享(base64 win32com)
2014/01/19 Python
Python学习笔记之函数的参数和返回值的使用
2019/11/20 Python
Python猜数字算法题详解
2020/03/01 Python
python中pathlib模块的基本用法与总结
2020/08/17 Python
python 利用panda 实现列联表(交叉表)
2021/02/06 Python
canvas裁剪clip()函数的具体使用
2018/03/01 HTML / CSS
Turnbull & Asser官网:英国皇室御用的顶级定制衬衫
2019/01/31 全球购物
在家更换处方镜片:Lensabl
2019/05/01 全球购物
The Body Shop美体小铺西班牙官网:天然化妆品
2019/06/21 全球购物
莫斯科隐形眼镜网上商店:Linzi
2019/07/22 全球购物
办公室文秘自我鉴定
2013/09/21 职场文书
团日活动策划书
2014/02/01 职场文书
九年级政治教学反思
2014/02/06 职场文书
行政助理的岗位职责
2014/02/18 职场文书
读群众路线心得体会
2014/03/07 职场文书
社团活动总结范文
2014/04/26 职场文书
宪法宣传周工作方案
2014/05/26 职场文书
广场舞大赛策划方案
2014/05/31 职场文书
Vue h函数的使用详解
2022/02/18 Vue.js
动画「半妖的夜叉姬」新BD特典图公开
2022/03/22 日漫
TV动画《史上最强大魔王转生为村民A》番宣CM公布
2022/04/01 日漫
golang的文件创建及读写操作
2022/04/14 Golang