【问题标题】:Invoke pre-parsed command line with Node.js使用 Node.js 调用预解析的命令行
【发布时间】:2016-11-11 08:37:11
【问题描述】:

我需要调用以下命令,其中密码是用户输入。但是,我担心可能会受到攻击,例如"; rm -rf / ;"是用户给出的输入。

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

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

我可以通过将某些字符列入黑名单来避免这个问题,但这似乎不太可靠,我想避免它是可能的。

【问题讨论】:

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


    【解决方案1】:

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

    在您的情况下,有一个更简单的解决方案:您正在构建一个命令行,它只是将密码发送到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);
    });
    

    【讨论】:

    • 看起来这可能可行,但还没有时间实现它。
    【解决方案2】:

    @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());
    });
    

    【讨论】:

      猜你喜欢
      • 2015-04-30
      • 1970-01-01
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-03
      • 2013-09-13
      相关资源
      最近更新 更多