使用 Node.js 调用预解析的命令行
Invoke pre-parsed command line with Node.js
我需要调用以下命令,其中密码是用户输入的。但是,我担心有可能被攻击,比如"; rm -rf / ;"
是用户给的输入
var checkPassword = exec('echo "'+password+ '"| cracklib-check\n', function(err, stdout, stderr) {
...
...
}
有没有一种方法可以使用预解析的参数调用命令(最好是 nodejs/ javascript 的本地方法),有点像用于避免 SQL 注入的准备好的语句?
我可能可以通过将某些字符列入黑名单来避免这个问题,但这似乎不太可靠,我想避免它是可能的。
正如您所指出的,使用用户提供的输入构建命令行是一个安全问题。通常,您会编写一个包装器,在调用命令之前验证每个用户提供的参数是否符合白名单。
然而,在您的情况下,有一个更简单的解决方案:您正在构建一个命令行,该命令行仅将密码发送到 cracklib-check
的标准输入。您可以切换到 child_process.spawn
,而不是使用 child_process.exec
,这样您就可以直接写入标准输入,避免使用用户提供的输入构建命令行。
以下示例代码避免了安全问题:
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);
});
@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());
});
我需要调用以下命令,其中密码是用户输入的。但是,我担心有可能被攻击,比如"; rm -rf / ;"
是用户给的输入
var checkPassword = exec('echo "'+password+ '"| cracklib-check\n', function(err, stdout, stderr) {
...
...
}
有没有一种方法可以使用预解析的参数调用命令(最好是 nodejs/ javascript 的本地方法),有点像用于避免 SQL 注入的准备好的语句?
我可能可以通过将某些字符列入黑名单来避免这个问题,但这似乎不太可靠,我想避免它是可能的。
正如您所指出的,使用用户提供的输入构建命令行是一个安全问题。通常,您会编写一个包装器,在调用命令之前验证每个用户提供的参数是否符合白名单。
然而,在您的情况下,有一个更简单的解决方案:您正在构建一个命令行,该命令行仅将密码发送到 cracklib-check
的标准输入。您可以切换到 child_process.spawn
,而不是使用 child_process.exec
,这样您就可以直接写入标准输入,避免使用用户提供的输入构建命令行。
以下示例代码避免了安全问题:
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);
});
@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());
});