4

私はここで本当に混乱しています、誰かが私にこれを説明できますか?

リクエスト: http://example.com/test.php?var=String's

$a = $_GET["var"];
$b = "String's";

echo $a . "<br/>";
echo $b . "<br/>";

$output = mysql_real_escape_string($a);
$output = mysql_real_escape_string($b);
echo "<hr/>";
echo $a . "<br/>";
echo $b . "<br/>";

結果:

String\'s
String's
----------------
String\'s
String's

GET 変数がこのように変換される理由だけでなく、入力が送信されたとおりになるようにこの動作を削除する方法を説明してもらえますか? SQL ラッパーが mysql_real_escape_string() を介してこれを渡し、最終的にString\\\'s:(になるという問題があります。

4

3 に答える 3

6

それは「魔法の引用符」と呼ばれます。

于 2010-08-19T19:01:52.513 に答える
2

マジック クォートを無効にすることができますし、無効にする必要があります。


優先モード
はphp.iniでそれらをオフに設定します


.htaccess モード
では、これを htaccess ファイルに追加します

php_flag magic_quotes_gpc off


php5 ランタイム モード

<?php
if (get_magic_quotes_gpc()) {
    function stripslashes_gpc(&$value)
    {
        $value = stripslashes($value);
    }
    array_walk_recursive($_GET, 'stripslashes_gpc');
    array_walk_recursive($_POST, 'stripslashes_gpc');
    array_walk_recursive($_COOKIE, 'stripslashes_gpc');
    array_walk_recursive($_REQUEST, 'stripslashes_gpc');
}
?>


php4 ランタイム モード

<?php
if (get_magic_quotes_gpc()) {
    $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
    while (list($key, $val) = each($process)) {
        foreach ($val as $k => $v) {
            unset($process[$key][$k]);
            if (is_array($v)) {
                $process[$key][stripslashes($k)] = $v;
                $process[] = &$process[$key][stripslashes($k)];
            } else {
                $process[$key][stripslashes($k)] = stripslashes($v);
            }
        }
    }
    unset($process);
}
?>


magic_quotesヘイターズクラブへようこそ!:)

于 2010-08-19T19:07:40.127 に答える
0

おそらく魔法の引用符がオンになっています。これにより、GET、POST、および COOKIE データが自動的にエスケープされます。マジック クォートは良くないので、データを適切にエスケープするために当てにすべきではありません。

php.ini にアクセスできる場合は、マジック クォートをオフにすることができます。

そうでない場合は、データに対してストリップスラッシュを実行してスラッシュを削除できます。コードを移植可能にするために、最初get_magic_quotes_gpc()に有効になっているかどうかを確認してから、stripslashes を実行する必要があります。このように、マジック クォートがオフになっているサーバーにコードを移動しても、コードは機能します。

if(get_magic_quotes_gpc()) {
    $a = stripslashes($_GET["var"]);
}
else $a = $_GET["var"];
于 2010-08-19T19:09:39.457 に答える