2016-10-28 3 views
0

パスワードがユーザ入力の場合、次のコマンドを呼び出す必要があります。しかし、私は攻撃の可能性について心配しています。例えば、"; rm -rf/;"がユーザーからの入力です。Node.jsであらかじめ解析されたコマンドラインを呼び出す

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

種類のSQLインジェクションを回避するために使用される準備文等(nodejs/JavaScriptに好ましくは天然)事前解析された引数を使用してコマンドを起動する方法はありますか?

特定の文字をブラックリストに登録することでこの問題を回避できる可能性がありますが、それははるかに信頼性が低いと思われます。

答えて

0

私が始めたのが、私はまだエンコーディングを処理しなければなりませんでした。

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

ユーザーが入力したコマンドラインを構築することは、セキュリティの問題です。通常は、コマンドを呼び出す前に各ユーザー提供のパラメーターがホワイトリストに一致することを確認するラッパーを作成します。

ただし、単純な解決方法があります。パスワードを標準入力cracklib-checkに送信するだけのコマンドラインを作成しています。 child_process.execを使用する代わりに、child_process.spawnに切り替えることができます。これにより、stdinに直接書き込むことができ、ユーザーが入力したコマンドラインをビルドする必要がなくなります。

次のサンプルコードは、セキュリティ上の問題回避:答えIlmoraさん@

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); 
}); 
+0

このように思えるかもしれませんが、まだ実装するには時間がかかりません。 – PunDefeated

関連する問題