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 相关文章推荐
5款Javascript颜色选择器
Oct 25 Javascript
JavaScript 学习笔记(九)call和apply方法
Jan 11 Javascript
基于jquery的lazy loader插件实现图片的延迟加载[简单使用]
May 07 Javascript
jquery图片延迟加载 前端开发技能必备系列
Jun 18 Javascript
jquery入门—数据删除与隔行变色以及图片预览
Jan 07 Javascript
Jquery 实现弹出层插件
Jan 28 Javascript
jQuery基于图层模仿五星星评价功能的方法
May 07 Javascript
JS正则表达式比较常见用法
Jan 26 Javascript
AngularJs基本特性解析(一)
Jul 21 Javascript
jQuery通过ajax方法获取json数据不执行success的原因及解决方法
Oct 15 Javascript
微信小程序vant弹窗组件的实现方式
Feb 21 Javascript
JavaScript中遍历的十种方法总结
Dec 15 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中文处理 中文字符串截取(mb_substr)和获取中文字符串字数
2011/11/10 PHP
PHP中去除换行解决办法小结(PHP_EOL)
2011/11/27 PHP
PHP缓存技术的多种方法小结
2012/08/14 PHP
如何使用FireFox插件FirePHP调试PHP
2013/07/23 PHP
mcrypt启用 加密以及解密过程详细解析
2013/08/07 PHP
简单实用的PHP防注入类实例
2014/12/05 PHP
php+ajax简单实现全选删除的方法
2016/12/06 PHP
在 PHP 和 Laravel 中使用 Traits的方法
2019/11/13 PHP
Thinkphp框架+Layui实现图片/文件上传功能分析
2020/02/07 PHP
解决PhpStorm64不能启动的问题
2020/06/20 PHP
Chrome Form多次提交表单问题的解决方法
2011/05/09 Javascript
jquery实现网站超链接和图片提示效果
2013/03/21 Javascript
js window.print实现打印特定控件或内容
2013/09/16 Javascript
Winform客户端向web地址传参接收参数的方法
2016/05/17 Javascript
CentOS 安装NodeJS V8.0.0的方法
2017/06/15 NodeJs
layui富文本编辑器前端无法取值的解决方法
2019/09/18 Javascript
基于jQuery实现挂号平台首页源码
2020/01/06 jQuery
js实现全选和全不选
2020/07/28 Javascript
JavaScript实现打字游戏
2021/02/19 Javascript
[02:19]DOTA2上海特级锦标赛 观赛指南 Spectator Guide
2016/02/04 DOTA
[55:32]2018DOTA2亚洲邀请赛 4.4 淘汰赛 EG vs LGD 第二场
2018/04/05 DOTA
Python调用ctypes使用C函数printf的方法
2017/08/23 Python
python编写简易聊天室实现局域网内聊天功能
2018/07/28 Python
对Python subprocess.Popen子进程管道阻塞详解
2018/10/29 Python
Python常见数据类型转换操作示例
2019/05/08 Python
python爬虫 爬取超清壁纸代码实例
2019/08/16 Python
python词云库wordcloud的使用方法与实例详解
2020/02/17 Python
django跳转页面传参的实现
2020/09/17 Python
带有css3动画效果的兼容多浏览器简单导航条示例
2014/01/26 HTML / CSS
CSS3的resize属性使用初探
2015/09/27 HTML / CSS
Vince官网:全球著名设计师品牌,休闲而优雅的服饰
2017/01/15 全球购物
实习老师个人总结的自我评价
2013/09/28 职场文书
幼儿教师师德师风演讲稿
2014/08/22 职场文书
报表员工作失误检讨书范文
2014/09/19 职场文书
党员群众路线自我剖析材料
2014/10/06 职场文书
英文感谢信格式
2015/01/21 职场文书