使用Node.js调用预解析的命令行

时间:2016-10-28 17:09:23

标签: javascript node.js security command-line exec

我需要调用以下命令,其中password是用户输入。但是,我担心发生攻击的可能性,例如"; rm -rf / ;"是用户提供的输入。

var checkPassword = exec('echo "'+password+ '"| cracklib-check\n', function(err, stdout, stderr) {
...
...
}

有没有办法用预先解析的参数调用命令(最好是nodejs / javascript原生的),有点像用于避免SQL注入的预处理语句?

我可以通过将某些字符列入黑名单来避免这个问题,但这似乎不太可靠,我希望避免这种情况。

2 个答案:

答案 0 :(得分:1)

正如您所指出的,使用用户提供的输入构建命令行是一个安全问题。通常,您会编写一个包装器,在调用命令之前验证每个用户提供的参数是否符合白名单。

在您的情况下,有一个更简单的解决方案:您正在构建一个命令行,只需将密码发送到cracklib-check的标准输入。您可以切换到允许直接写入stdin的child_process.exec,而不是使用child_process.spawn,从而无需使用用户提供的输入构建命令行。

以下示例代码避免了安全问题:

const spawn = require('child_process').spawn;

// Read password from argument to nodejs invocation
var password = process.argv[2];

// Spawn cracklib-check
var cracklib_check = spawn("/usr/sbin/cracklib-check");

// Send password to cracklib-check STDIN
cracklib_check.stdin.write(password);
cracklib_check.stdin.end();

// Process results of cracklib-check
cracklib_check.stdout.on('data', function (data) {
  console.log("[*] " + data);
});

cracklib_check.stderr.on('data', function (data) {
  console.log("[-] " + data);
});

答案 1 :(得分:0)

@ Ilmora的回答让我开始,但我仍然需要处理编码。

const spawn = require('child_process').spawn;

// Read password from argument to nodejs invocation
var password = process.argv[2];

var cracklib_check = spawn('/usr/sbin/cracklib-check');

cracklib_check.stdin.setEncoding = 'utf-8';
cracklib_check.stdin.write(password);
cracklib_check.stdin.end();

// Process results of cracklib-check
cracklib_check.stdout.on('data', function (data) {
  console.log("[*] " + data.toString());
});

cracklib_check.stderr.on('data', function (data) {
  console.log("[-] " + data.toString());
});