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实现用方向键控制层的上下左右移动
Jan 13 Javascript
用jQuery实现的智能隐藏、滑动效果的返回顶部代码
Mar 18 Javascript
ZeroClipboard插件实现多浏览器复制功能(支持firefox、chrome、ie6)
Aug 30 Javascript
Bootstrap入门书籍之(五)导航条、分页导航
Feb 17 Javascript
jQuery页面加载初始化的3种方法(推荐)
Jun 02 Javascript
Javascript 闭包详解及实例代码
Nov 30 Javascript
jQuery实现两个select控件的互移操作
Dec 22 Javascript
ES6新特性:使用export和import实现模块化详解
Jul 31 Javascript
Vue组件全局注册实现警告框的实例详解
Jun 11 Javascript
基于JavaScript实现每日签到打卡轨迹功能
Nov 29 Javascript
实例讲解v-if和v-show的区别
Jan 31 Javascript
vue制作抓娃娃机的示例代码
Apr 17 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
自制汽车收音机天线:收听广播的技巧和方法
2021/03/02 无线电
php+ajax做仿百度搜索下拉自动提示框(有实例)
2012/08/21 PHP
php实现图片转换成ASCII码的方法
2015/04/03 PHP
浅谈PDO的rowCount函数
2015/06/18 PHP
Zend Framework框架中实现Ajax的方法示例
2017/06/27 PHP
用js实现键盘方向键翻页功能的代码
2007/06/03 Javascript
10个新的最有前途的JavaScript框架
2009/03/12 Javascript
jQuery中对节点进行操作的相关介绍
2013/04/16 Javascript
jquery.cookie用法详细解析
2013/12/18 Javascript
javascript禁止超链接跳转的方法
2016/02/02 Javascript
NodeJS、NPM安装配置步骤(windows版本) 以及环境变量详解
2017/05/13 NodeJs
JavaScript注册时密码强度校验代码
2017/06/30 Javascript
jQuery取得元素标签名称小结(附代码)
2017/08/16 jQuery
html中通过JS获取JSON数据并加载的方法
2017/11/30 Javascript
vue.js系列中的vue-fontawesome使用
2018/02/10 Javascript
Javasript设计模式之链式调用详解
2018/04/26 Javascript
Javascript 关于基本类型和引用类型的个人理解
2019/11/01 Javascript
javascript实现京东快递单号的查询效果
2020/11/30 Javascript
python对DICOM图像的读取方法详解
2017/07/17 Python
python Matplotlib画图之调整字体大小的示例
2017/11/20 Python
Python编程快速上手——强口令检测算法案例分析
2020/02/29 Python
Python获取浏览器窗口句柄过程解析
2020/07/25 Python
python实现数学模型(插值、拟合和微分方程)
2020/11/13 Python
CSS3属性选择符介绍
2008/10/17 HTML / CSS
使用CSS3在触屏上为按钮实现激活效果
2013/09/27 HTML / CSS
Haglöfs瑞典官方网站:haglofs火柴棍,欧洲顶级户外品牌
2018/10/18 全球购物
土木工程毕业生推荐信
2013/10/28 职场文书
临床医学应届生求职信
2013/11/06 职场文书
生物医学工程专业学生求职信范文分享
2013/12/14 职场文书
美国留学经济担保书
2014/05/20 职场文书
2014年师德承诺书
2014/05/23 职场文书
公司总经理助理岗位职责
2014/07/09 职场文书
教师政风行风评议心得体会
2014/10/21 职场文书
优秀团员事迹材料
2014/12/25 职场文书
个人催款函范文
2015/06/23 职场文书
SpringBoot实现异步事件驱动的方法
2021/06/28 Java/Android