ホームページ  >  記事  >  ウェブフロントエンド  >  Node.js でシステム コマンドを安全に呼び出す方法 (セキュリティの脆弱性の挿入を避けるため)

Node.js でシステム コマンドを安全に呼び出す方法 (セキュリティの脆弱性の挿入を避けるため)

PHPz
PHPzオリジナル
2016-05-16 16:29:071579ブラウズ

この記事では、主に 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)
});
spawn または execfile を使用する場合、目的は 1 つのコマンド (パラメーター) のみを実行することです。これは、/bin/ls がバックティックやパイプを処理する方法を知らないため、ユーザーは挿入されたコマンドを実行できないことを意味します。 /bin/bash が行うことは、これらのコマンドのパラメーターを解釈することです。慣れている場合は

を使用するのと似ていますが、注意点があります。たとえば、次のようにします。 /bin/find を実行してユーザー入力パラメーターを渡すと、システムが侵害される可能性があります。find コマンドには、任意のファイルの読み取り/書き込みを許可するオプションがいくつかあります。>そこで、Node.js でシステム コマンドを実行するためのガイドラインをいくつか示します。 :
[pid 25565] execve("/bin/ls", ["/bin/ls", "-l", "."], [/* 16 vars */]

child_process.exec の使用は避けてください。特にユーザーが入力したパラメーターを含める必要がある場合は、ユーザーに入力を求めるよりも、オプションを使用してユーザーにパラメーターを渡せるようにする方がはるかに優れています。文字列を直接入力する ユーザーにパラメータの入力を許可する必要がある場合は、コマンドのパラメータを徹底的に調べて、どのオプションが安全であるかを判断し、リストを作成します。

上記はこの内容全体です。詳細な関連チュートリアルについては、

Node.js ビデオ チュートリアル

をご覧ください。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。