10

私は PHP のマジック クォートの逸脱を完全に認識していますmagic_quotes_runtime。php.ini から:

SQL からのデータ、exec() からのデータなど、実行時に生成されたデータのマジック クォート。

オンになっているかどうかを確認し、次のようにしてオフにする必要があります。

set_magic_quotes_runtime(false);

デフォルトでオンになっていることが多いですか?5.3.0 で廃止され、6.0.0 で削除されたことは知っていますが、私のスクリプトは 5.1.0 以降をサポートしているため、「レガシー」PHP でこれを処理する方法を知りたいです (関連する場合)。

編集:明確にするために、私は終了したいです(「魔法の引用符をオフにする」); 魔法の引用符がオンのとき。私は彼らに頼っていません!

4

3 に答える 3

6

magic_quotes_runtime が有効になっている場合、データベースやテキスト ファイルを含むあらゆる種類の外部ソースからデータを返すほとんどの関数で、引用符がバックスラッシュでエスケープされます。magic_quotes_sybase もオンの場合、単一引用符はバックスラッシュの代わりに単一引用符でエスケープされます。

http://www.php.net/manual/en/info.configuration.php#ini.magic-quotes-runtime

于 2010-01-22T16:04:01.187 に答える
0

マジック クォートがオンの場合、php は POST または GET 変数に含まれる引用符を自動的にエスケープし、たとえばデータベースからデータを引き出すときに自動的にエスケープ解除します。

マジック クォートをオンにして、addslashes()、mysql_escape_string()、または mysql_real_escape_string() などを使用すると、ダブル エスケープ クォートになってしまいます。

それが悪である理由は、addslashes() と mysql_escape_string() が悪であるのと同じ理由です。文字列に引用符を入れるすべての可能な方法をキャプチャしないためです。実際にはまだ引用符をエスケープすることを心配する必要はないと考えると、誤った安心感が得られます。

また、文字列をエスケープするだけでは PITA として十分ではないかのように、ダブル エスケープを避けるために、文字列をエスケープまたはエスケープ解除する前に、マジック クォートがオンかオフかを確認する必要があります。

于 2010-01-22T16:09:27.987 に答える
0

次のように、ini_get を使用してその値を確認できます。

ini_get('magic_quotes_runtime');

また、 set_magic_quotes_runtime/get_magic_quotes_runtime への呼び出しを function_exists 呼び出しでラップする必要があります。

if (function_exists('set_magic_quotes_runtime')) {
set_magic_quotes_runtime(true/false);
}

しかしもちろん、魔法の引用符に頼るべきではなく、可能であれば無効にするべきです。理由については、このリンクを参照してください: http://www.php.net/manual/en/security.magicquotes.whynot.php

于 2010-01-22T16:04:53.770 に答える