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 相关文章推荐
Node.js Addons翻译(C/C++扩展)
Jun 12 Javascript
使用bootstrap validator的remote验证代码经验分享(推荐)
Sep 21 Javascript
Vue 父子组件、组件间通信
Mar 08 Javascript
基于Vue过渡状态实例讲解
Sep 14 Javascript
利用JS hash制作单页Web应用的方法详解
Oct 10 Javascript
使用Vue-Router 2实现路由功能实例详解
Nov 14 Javascript
JS 中document.write()的用法和清空的原因浅析
Dec 04 Javascript
vue.js中引入vuex储存接口数据及调用的详细流程
Dec 14 Javascript
JS实现的杨辉三角【帕斯卡三角形】算法示例
Feb 26 Javascript
JavaScript实现的弹出遮罩层特效经典示例【基于jQuery】
Jul 10 jQuery
微信小程序表单验证插件WxValidate的二次封装功能(终极版)
Sep 03 Javascript
js实现数字跳动到指定数字
Aug 25 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
《星际争霸》各版本雷兽特点图文解析 雷兽不同形态一览
2020/03/02 星际争霸
PHP实现Javascript中的escape及unescape函数代码分享
2015/02/10 PHP
PHP获取Exif缩略图的方法
2015/07/13 PHP
Smarty3配置及入门语法
2017/02/22 PHP
PHP实现git部署的方法教程
2017/12/19 PHP
PHP xpath提取网页数据内容代码解析
2020/07/16 PHP
Google韩国首页图标动画效果
2007/08/26 Javascript
Prototype Selector对象学习
2009/07/23 Javascript
jQuery asp.net 用json格式返回自定义对象
2010/04/07 Javascript
JS中Date日期函数中的参数使用介绍
2014/01/02 Javascript
Select标签下拉列表二级联动级联实例代码
2014/02/07 Javascript
jQuery表单域选择器用法分析
2015/02/10 Javascript
javascript实现checkbox复选框实例代码
2016/01/10 Javascript
浅析jQuery 3.0中的Data
2016/06/14 Javascript
JavaScript仿flash遮罩动画效果
2016/06/15 Javascript
vue click.stop阻止点击事件继续传播的方法
2018/09/04 Javascript
Angular PWA使用的Demo示例
2019/01/31 Javascript
React+Redux实现简单的待办事项列表ToDoList
2019/09/29 Javascript
浅析python 内置字符串处理函数的使用方法
2014/06/11 Python
Python使用迭代器打印螺旋矩阵的思路及代码示例
2016/07/02 Python
Python常见排序操作示例【字典、列表、指定元素等】
2018/08/15 Python
Django安装配置mysql的方法步骤
2018/10/15 Python
Python实现FTP文件传输的实例
2019/07/07 Python
python单线程下实现多个socket并发过程详解
2019/07/27 Python
python如何实现不用装饰器实现登陆器小程序
2019/12/14 Python
Python selenium模块实现定位过程解析
2020/07/09 Python
瑞士国际航空官网:SWISS
2016/07/21 全球购物
大学军训通讯稿
2014/01/13 职场文书
西式婚礼主持词
2014/03/13 职场文书
财务会计实训报告
2014/11/05 职场文书
七一活动主持词
2015/06/29 职场文书
100句拼搏进取的名言警句,值得一读!
2019/10/07 职场文书
python保存大型 .mat 数据文件报错超出 IO 限制的操作
2021/05/10 Python
pytorch 实现变分自动编码器的操作
2021/05/24 Python
Pytorch可视化的几种实现方法
2021/06/10 Python
Tomcat安装使用及部署Web项目的3种方法汇总
2022/08/14 Servers