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,则可以关闭魔术引号

如果不这样做,您可以对数据运行stripslashes以删除斜杠。为了使您的代码可移植,您应该首先检查get_magic_quotes_gpc()它是否已打开,然后才运行 stripslashes。这样,如果您将代码移动到关闭了魔术引号的服务器,您的代码仍然可以工作。

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