3

私は会社のレガシー Web アプリケーションの 1 つに割り当てられました。ソースを 1 日か 2 日調べてみたところ、次のような SQL インジェクション ベクトルが見つかりました。

mysql_query("SELECT * FROM foo WHERE bar='" . $_GET['baz'] . "'");

これに対して SQL インジェクション テストを実行しようとしましたが、PHP のmagic_quotes_gpcモジュールがオンになっているために失敗します。

magic_quotes_gpcdirtyであることはわかっていますが、上記のようなコードは数千行とは言わないまでも数百行あります。magic_quotes_gpcこのようなコードは攻撃に対して無防備なままになるため、スイッチをオフにするわけにはいきません。

上記のコードがどの程度「悪用可能」であるか、すぐに修正する必要があるのか​​、それとも修正作業を他のリファクタリング タスクに含める必要があるのか​​を知りたいです。

4

3 に答える 3

7

サイトを移行する通常の方法magic_quotes_gpcは、ラッパー関数を追加することです。

function m($s) {
    if (get_magic_quotes_gpc())
        $s= stripslashes($s);
    return mysql_real_escape_string($s);
}

mysql_query("SELECT * FROM foo WHERE bar='".m($_GET['baz'])."'");

addslashesこれにより、場合によっては脆弱性を引き起こす可能性のある文字セットに対応していないという問題が修正され、通常、コードは以前と同じように「機能」し続けます。

ただし、長期的には、入力エスケープに依存することは持続不可能です。データベースに挿入していない入力文字列にスラッシュが乗算され、データベースに挿入している文字列を他のソースからエスケープできないためです。これが本当の理由magic_quotes_gpcです。間違っているのは、出力ステージのエンコーディングを入力ステージに適用しているからです。

したがって、ラッパー関数を追加してから、それを使用するためにすべてのSQL補間をゆっくりと更新してください。それらをすべて入手したら、魔法の引用符をオフにすることができます。

于 2010-01-24T12:46:17.310 に答える
0

魔法の引用符がオンになっていて、それをすり抜ける可能性のある特別な文字エンコードを使用しない限り、いわば大丈夫です。問題は、何らかの理由(サーバーの変更、構成の変更)でマジッククォートがアクティブでない場合、修正する必要のある穴がたくさんあることです。

于 2010-01-24T12:47:37.770 に答える
-1

サーバー構成でmagic_quotesが無効になっている場合でも、magic_quotesが有効になっていることを確認する行を最初に追加します。そうすれば、多かれ少なかれ安全になります。

于 2010-01-24T12:51:05.910 に答える