繁体   English   中英

Node.js:为 exec() 清理不受信任的用户输入

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM