[英]Node.js: Sanitize untrusted user input for exec()
小例子,从 REST API node.js 应用程序减少:
const { exec } = require('child_process');
var userInput = 'untrusted source';
var cmd = `/bin/echo "${userInput}"`;
exec(cmd, function(err, stdout, stderr) {
console.log('echo: ' + stdout);
});
假设userInput
来自不受信任的来源,需要做什么来避免任何漏洞? 例如, echo
中带引号的"${userInput}"
参数避免了 input 'evil spirit; rm -rf /'
'evil spirit; rm -rf /'
以免造成损坏。 还需要做些什么来保证安全?
更新:目标是使文件系统中的一些现有 shell 脚本/命令可通过 REST API 在 int ra网上使用。
基于https://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options的官方 Node.js child_process
文档,在 shell 脚本中使用用户输入而不对其进行消毒是(显然)不安全的:
如果启用了 shell 选项,请不要将未经过滤的用户输入传递给此 function。任何包含 shell 元字符的输入都可用于触发任意命令执行。
因此,这是我的问题中所述的示例,使用 spawn 而不是 exec 以安全的方式重写:
const { spawn } = require('child_process');
var userInput = 'untrusted source';
var args = [ userInput ];
var cmd = '/bin/echo';
var subprocess = spawn(cmd, args);
var stderr = '';
var stdout = '';
subprocess.stdout.on('data', function(data) {
stdout += data;
});
subprocess.stderr.on('data', function(data) {
stderr += data;
});
subprocess.on('close', function(exitCode) {
console.log('echo: ' + stdout);
});
这是 CLI 包装器 Node.js 应用程序的简化代码片段,它使内部网络上的现有命令和 shell 脚本通过 REST API 以安全的方式可用: https://github.com/peterthoney/rest-cli-io
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.