我真的很困惑,有人可以向我解释一下吗?
请求:
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
:(
答案 0 :(得分:6)
它被称为"magic quotes"。
答案 1 :(得分: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
仇恨俱乐部! :)
答案 2 :(得分:0)
你可能已经启用了魔术引号。这会自动转义GET,POST和COOKIE数据。魔术引用很糟糕,不应该依赖它来正确地逃避数据。
如果您可以访问php.ini,则可以turn magic quotes off。
如果不这样做,您可以对数据运行stripslashes以删除斜杠。为了使您的代码可移植,您应首先检查get_magic_quotes_gpc()
以查看它是否已打开,然后才运行stripslashes。这样,如果您将代码移动到关闭魔术引号的服务器,您的代码仍然有效。
if(get_magic_quotes_gpc()) {
$a = stripslashes($_GET["var"]);
}
else $a = $_GET["var"];