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 相关文章推荐
javascript 处理HTML元素必须避免使用的一种方法
Jul 30 Javascript
JS 表单验证大全
Nov 23 Javascript
javascript 回调函数详解
Nov 11 Javascript
jQuery源码分析之Callbacks详解
Mar 13 Javascript
微信小程序 picker 组件详解及简单实例
Jan 10 Javascript
Angular2 自定义validators的实现方法
Jul 05 Javascript
javascript设计模式 ? 状态模式原理与用法实例分析
Apr 22 Javascript
Vue使用预渲染代替SSR的方法
Jul 02 Javascript
Vue 同步异步存值取值实现案例
Aug 05 Javascript
js实现页面导航层级指示效果
Aug 25 Javascript
npm ci命令的基本使用方法
Sep 20 Javascript
vue 使用 v-model 双向绑定父子组件的值遇见的问题及解决方案
Mar 01 Vue.js
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 HtmlReplace输入过滤安全函数
2010/07/03 PHP
php字符串分割函数explode的实例代码
2013/02/07 PHP
php遍历删除整个目录及文件的方法
2015/03/13 PHP
基于jquery的cookie的用法
2011/01/10 Javascript
javascript中xml操作实现代码
2011/11/21 Javascript
YUI Compressor压缩JavaScript原理及微优化
2013/01/07 Javascript
JavaScript 验证码的实例代码(附效果图)
2013/03/22 Javascript
js动态调用css属性的小规律及实例说明
2013/12/28 Javascript
谈谈基于iframe、FormData、FileReader三种无刷新上传文件的方法
2015/12/03 Javascript
一个炫酷的Bootstrap导航菜单
2016/12/28 Javascript
简单实现jQuery轮播效果
2017/08/18 jQuery
深入理解ES6 Promise 扩展always方法
2017/09/26 Javascript
vue2.0.js的多级联动选择器实现方法
2018/02/09 Javascript
vue+element实现打印页面功能
2019/05/20 Javascript
让 babel webpack vue 配置文件支持智能提示的方法
2019/06/22 Javascript
对layui中table组件工具栏的使用详解
2019/09/19 Javascript
Vue实现菜单切换功能
2020/11/08 Javascript
Python备份Mysql脚本
2008/08/11 Python
简单介绍利用TK在Python下进行GUI编程的教程
2015/04/13 Python
Python中每次处理一个字符的5种方法
2015/05/21 Python
python算法演练_One Rule 算法(详解)
2017/05/17 Python
python 除法保留两位小数点的方法
2018/07/16 Python
基于python实现的百度新歌榜、热歌榜下载器(附代码)
2019/08/05 Python
详解Anconda环境下载python包的教程(图形界面+命令行+pycharm安装)
2019/11/11 Python
Python绘制二维曲线的日常应用详解
2019/12/04 Python
Python 获取异常(Exception)信息的几种方法
2020/12/29 Python
Groupon法国官方网站:特卖和网上购物高达-70%
2019/09/02 全球购物
什么是跨站脚本攻击
2014/12/11 面试题
西安当代医院管理研究院笔试题
2015/12/11 面试题
人事助理岗位职责
2013/11/18 职场文书
毕业生欢送会主持词
2014/03/31 职场文书
安全演讲稿大全
2014/05/09 职场文书
给校长的建议书500字
2014/05/15 职场文书
2014年党员自我评议对照检查材料
2014/09/20 职场文书
第一军规观后感
2015/06/12 职场文书
Pyhton模块和包相关知识总结
2021/05/12 Python