1

私は、次のような PHP スニペットを数多く見てきました。

function DB_Quote($string)
{
    if (get_magic_quotes_gpc() == true)
    {
        $string = stripslashes($string);
    }

    return mysql_real_escape_string($string);
}

に電話するとどうなりますDB_Quote("the (\\) character is cool");か? (ありがとうjspcal!)

値が、またはスーパーグローバルから発生した場合get_magic_quotes_gpc() == true のみ、スラッシュを削除することになっていませんか?$_GET$_POST$_COOKIE

4

5 に答える 5

6

ステップ 1 は、マジック クォートを完全にオフにし、オンになっている場合は無視できない大きな警告を発行することです。

これが選択肢にならない場合、私の意見では、すべての魔法の引用符を常に削除するのが最善の方法です.

// in an include used on every page load:
if (get_magic_quotes_gpc()) {
    foreach (array('_GET', '_POST', '_COOKIE', '_REQUEST') as $src) {
        foreach ($$src as $key => $val) {
            $$src[$key] = stripslashes($val);
        }
    }
}

パフォーマンスはわずかに低下しますが、それ以降変数を操作する際の負担が大幅に軽減されます。

于 2010-01-04T01:26:36.733 に答える
5

ええ、私もそのような PHP スニペットを何十も見てきました。少し悲しいです。

マジック クォートは入力の問題です。GET/POST/COOKIES配列を繰り返してスラッシュを削除することにより、入力段階で修正する必要がありますmagic_quotes_gpc. 簡単な代替手段は、マジック クォート オプションを検出し、設定時に「your server sucks」エラーで終了することです。

mysql_real_escape_string出力の問題です。パラメータ化されたクエリを使用していない場合は、スクリプトの途中、データベースに向かうコンテンツで実行する必要があります (これは間違いなく考慮する必要があります)。

これらは、プログラム内の 2 つの別個の無関係な段階です。すべての文字列処理を 1 つのボックスにカプセル化しようとするかもしれませんが、それらを同じ関数に入れることはできません。

[...] 値が $_GET、$_POST、または $_COOKIE スーパーグローバルから発生した場合にのみ、スラッシュを削除することになっていませんか?

はい、正確に。それが、あなたが引用したスニペットが実際に有害である理由です。文字列の起源を追跡することは非現実的であるため (特に、異なるソースからの文字列を組み合わせて、一方がスラッシュされ、もう一方がスラッシュされていない場合)、1 つの関数でそれを行うことはできません。適切なタイミングで呼び出される 2 つの別個の文字列処理関数である必要があります。

于 2010-01-04T01:24:46.333 に答える
2

ええ、davが言ったように、フォーム入力でストリップスラッシュのみを使用するスクリプトまで...

文字列 "O'Reilly" で stripslashes を呼び出すと、文字列は変更されません。"the backslash (\) character is cool" のような文字列で stripslashes を呼び出すと、結果はエスケープ シーケンス \) を ) に置き換えます。そのため、すべての db 値でその関数を使用すると、微妙に問題が発生する可能性がありますが、気付かない場合があります。

多くのアプリと同様に、マジック クォート モードをサポートしないこともできます。それをチェックし、オンの場合はエラーを出力します。デフォルトでは何年もオフになっており、お勧めできません。

于 2010-01-04T01:23:59.127 に答える
0

$_GET、$_POST、または $_COOKIE で次のことを試してから、他の操作を行うことができます。

<?php
if (get_magic_quotes_gpc ())
{
    $_POST = array_map ('stripslashes', $_POST);
}
?>

これは、入力配列が「フラット」である (サブ配列を含まない) 場合にのみ機能することに注意してください。入力にサブ配列が必要な場合は、それを処理する独自のコールバックを作成する必要があります。何かのようなもの

<?php
function slashField ($input)
{
    if (is_array ($input))
    {
        foreach ($input as $key => $row)
        {
            $input [$key]   = slashField ($row);
        }
    }
    else
    {
        $input  = stripslashes ($input);
    }
    return ($input);
}

if (get_magic_quotes_gpc ())
{
    $_POST = array_map ('slashfield', $_POST);
}
?>
于 2011-02-02T16:23:11.260 に答える