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 相关文章推荐
ext实现完整的登录代码
Aug 08 Javascript
验证javascript中Object和Function的关系的三段简单代码
Jun 27 Javascript
jQuery1.6 使用方法一
Nov 23 Javascript
jQuery过滤HTML标签并高亮显示关键字的方法
Aug 07 Javascript
js实现仿百度风云榜可重复多次调用的TAB切换选项卡效果
Aug 31 Javascript
跟我学习javascript的循环
Nov 18 Javascript
BootStrap轻松实现微信页面开发代码分享
Oct 21 Javascript
bootstrap制作jsp页面(根据值让table显示选中)
Jan 05 Javascript
Vue Element使用icon图标教程详解(第三方)
Feb 07 Javascript
解决layui checkbox 提交多个值的问题
Sep 02 Javascript
微信小程序全局变量的设置、使用、修改过程解析
Sep 24 Javascript
在Vue里如何把网页的数据导出到Excel的方法
Sep 30 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
剧场版动画《PSYCHO-PASS 3 FIRST INSPECTOR》3月27日日本上映!
2020/03/06 日漫
在win7中搭建Linux+PHP 开发环境
2014/10/08 PHP
php中FTP函数ftp_connect、ftp_login与ftp_chmod用法
2014/11/18 PHP
基于ThinkPHP实现的日历功能实例详解
2017/04/15 PHP
PHP使用PDO调用mssql存储过程的方法示例
2017/10/07 PHP
php 广告点击统计代码(php+mysql)
2018/02/21 PHP
javascript 多浏览器 事件大全
2010/03/23 Javascript
jQuery UI Dialog控件中的表单无法正常提交的解决方法
2010/12/19 Javascript
NodeJS制作爬虫全过程(续)
2014/12/22 NodeJs
js前端实现多图图片上传预览的两个方法(推荐)
2016/11/18 Javascript
原生js实现选项卡功能
2017/03/08 Javascript
微信小程序 input输入及动态设置按钮的实现
2017/10/27 Javascript
基于JavaScript中字符串的match与replace方法(详解)
2017/12/04 Javascript
jQuery实现手机号正则验证输入及自动填充空格功能
2018/01/02 jQuery
JavaScript基础心法 深浅拷贝(浅拷贝和深拷贝)
2018/03/05 Javascript
webpack+vuex+axios 跨域请求数据的示例代码
2018/03/06 Javascript
详解Vue路由自动注入实践
2019/04/17 Javascript
详解JavaScript中的坐标和距离
2019/05/27 Javascript
如何在wxml中直接写js代码(wxs)
2019/11/14 Javascript
ES6的异步操作之promise用法和async函数的具体使用
2019/12/06 Javascript
webpack.DefinePlugin与cross-env区别详解
2020/02/23 Javascript
python中文乱码的解决方法
2013/11/04 Python
Pycharm编辑器技巧之自动导入模块详解
2017/07/18 Python
Python设计模式之观察者模式简单示例
2018/01/10 Python
Pandas之ReIndex重新索引的实现
2019/06/25 Python
利用python实现短信和电话提醒功能的例子
2019/08/08 Python
多重CSS背景动画实现方法示例
2014/04/04 HTML / CSS
Canvas中设置width与height的问题浅析
2018/11/01 HTML / CSS
LN-CC日本:高端男装和女装的奢侈时尚目的地
2019/09/01 全球购物
希腊香水和化妆品购物网站:Parfimo.gr
2019/10/03 全球购物
XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?
2016/01/12 面试题
学子宴答谢词
2014/01/25 职场文书
2014年医药代表工作总结
2014/11/22 职场文书
幼儿园六一主持词开场白
2015/05/28 职场文书
现实表现证明材料
2015/06/19 职场文书
python基于tkinter制作无损音乐下载工具
2021/03/29 Python