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 相关文章推荐
JS模拟多线程
Feb 07 Javascript
jquery插件tooltipv顶部淡入淡出效果使用示例
Dec 05 Javascript
jquery.cookie() 方法的使用(读取、写入、删除)
Dec 05 Javascript
JavaScript中使用typeof运算符需要注意的几个坑
Nov 08 Javascript
node.js中的path.normalize方法使用说明
Dec 08 Javascript
Node.js实现文件上传
Jul 05 Javascript
图解Javascript——作用域、作用域链、闭包
Mar 21 Javascript
JavaScript上传文件时不用刷新页面方法总结(推荐)
Aug 15 Javascript
利用纯js + transition动画实现移动端web轮播图详解
Sep 10 Javascript
详解自定义ajax支持跨域组件封装
Feb 08 Javascript
这15个Vue指令,让你的项目开发爽到爆
Oct 11 Javascript
vue学习笔记之Vue中css动画原理简单示例
Feb 29 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 导出数据到淘宝助手CSV的方法分享
2010/02/27 PHP
PHP无刷新上传文件实现代码
2011/09/19 PHP
ThinkPHP中数据操作案例分析
2015/09/27 PHP
thinkPHP+PHPExcel实现读取文件日期的方法(含时分秒)
2016/07/07 PHP
PHP生成推广海报的方法分享
2018/04/22 PHP
PHP html_entity_decode()函数讲解
2019/02/25 PHP
PHP高并发和大流量解决方案整理
2019/12/24 PHP
实现连缀调用的map方法(prototype)
2009/08/05 Javascript
关于javascript DOM事件模型的两件事
2010/07/22 Javascript
理解Javascript_02_理解undefined和null
2010/10/11 Javascript
Knockoutjs的环境搭建教程
2012/11/26 Javascript
JQuery实现用户名无刷新验证的小例子
2013/03/22 Javascript
jquery中使用$(#form).submit()重写提交表单无效原因分析及解决
2013/03/25 Javascript
Jquery 类网页微信二维码图块滚动效果具体实现
2013/10/14 Javascript
js和jQuery设置Opacity半透明 兼容IE6
2016/05/24 Javascript
jQuery可见性过滤选择器用法示例
2016/09/09 Javascript
connection reset by peer问题总结及解决方案
2016/10/21 Javascript
jQuery实现的模拟弹出窗口功能示例
2016/11/24 Javascript
jquery实现轮播图效果
2017/02/13 Javascript
jquery对table做排序操作的实例演示
2017/08/10 jQuery
Vue 换肤的示例实践
2018/01/23 Javascript
es6中reduce的基本使用方法
2019/09/10 Javascript
JavaScript对象原型链原理解析
2020/01/22 Javascript
ant design vue datepicker日期选择器中文化操作
2020/10/28 Javascript
node.js如何操作MySQL数据库
2020/10/29 Javascript
[52:14]VG vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
Python 第一步 hello world
2009/09/25 Python
用Python配平化学方程式的方法
2019/07/20 Python
Python面向对象之Web静态服务器
2019/09/03 Python
巧用 CSS3的webkit-box-reflect 倒影实现各类动效
2021/03/05 HTML / CSS
Kiwi.com中国:找到特价机票并发现新目的地
2019/10/27 全球购物
服装设计师职业生涯规划范文
2014/02/28 职场文书
2014年圣诞节促销方案
2014/03/14 职场文书
五好家庭申报材料
2014/12/20 职场文书
详解Java实现数据结构之并查集
2021/06/23 Java/Android
python基础之函数的定义和调用
2021/10/24 Python