この記事では、主に Node.js でシステム コマンドを安全に呼び出す方法 (セキュリティの脆弱性を回避するため) を紹介します。この章では、文字列を接続するときに発生する可能性のあるセキュリティの問題について概説します。
この記事では、Node.js を正しく使用してシステム コマンドを呼び出し、一般的なコマンド ライン インジェクションの脆弱性を回避する方法を学びます。
コマンドを呼び出すためによく使用するメソッドは、最も単純な child_process.exec です。使用パターンは非常に単純で、文字列コマンドを渡し、エラーまたはコマンド処理結果をコールバック関数に返します。
これは、child_process.exec を通じてシステム コマンドを呼び出す非常に典型的な例です。
child_process.exec('ls', function (err, data) { console.log(data); });
しかし、呼び出すコマンドにユーザーが入力したパラメータを追加する必要がある場合はどうなるでしょうか?明らかな解決策は、ユーザー入力をコマンドと直接文字列マージすることです。しかし、私の長年の経験から言えることは、接続された文字列をあるシステムから別のシステムに送信すると、いつか問題が発生するということです。
var path = "user input"; child_process.exec('ls -l ' + path, function (err, data) { console.log(data); });
接続文字列に問題があるのはなぜですか?
まあ、child_process.exec エンジンの下で、「/bin/sh」が呼び出されて実行されるためです。ターゲットプログラムではなく。送信されたコマンドは、シェルを実行するために新しい '/bin/sh' プロセスに渡されるだけです。child_process.exec という名前はやや誤解を招きます。これは、プログラムを開始するものではなく、すべてのシェル文字が実行できることを意味します。ユーザーが入力したパラメータが直接実行されると、壊滅的な結果が生じます
[pid 25170] execve("/bin/sh", ["/bin/sh", "-c", "ls -l user input"], [/* 16 vars */]
たとえば、攻撃者はセミコロン「;」を使用してコマンドを終了し、バッククォートまたは $ を使用して新しいコマンドを開始することができます。
では、execFile/spawn<を呼び出す正しい方法は何ですか? 🎜>
spawn や execFile と同様に、追加の配列パラメータを使用できます。 execFile を使用して、システム コールがどのように異なるのか、またコマンド インジェクションに対して脆弱でない理由を確認してみましょう。システム コール
child_process.spawn
は、 を実行しているシステム コール
の spawn 置換を使用する例と非常によく似ています。 🎜>var child_process = require('child_process'); var path = "." child_process.execFile('/bin/ls', ['-l', path], function (err, result) { console.log(result) });
[pid 25565] execve("/bin/ls", ["/bin/ls", "-l", "."], [/* 16 vars */]
child_process.exec の使用は避けてください。特にユーザーが入力したパラメーターを含める必要がある場合は、ユーザーに入力を求めるよりも、オプションを使用してユーザーにパラメーターを渡せるようにする方がはるかに優れています。文字列を直接入力する ユーザーにパラメータの入力を許可する必要がある場合は、コマンドのパラメータを徹底的に調べて、どのオプションが安全であるかを判断し、リストを作成します。
上記はこの内容全体です。詳細な関連チュートリアルについては、Node.js ビデオ チュートリアル
をご覧ください。