写作时
输入数据:hel'l"lo
print_r($_POST)
显示 hel\'\"lo
当我使用
时if(get_magic_quotes_gpc()){
mysql_real_escape_string($_POST);
显示
hel\\\'\\\"lo
因为PHP会自动添加斜杠,是否需要使用mysql_real_escape_string
?
答案 0 :(得分:3)
不,从5.3版开始,默认情况下不会添加斜杠。另请注意,addslashes
不是mysql_real_escape_string
的替代品;您可以阅读有关here的更多信息。
答案 1 :(得分:2)
magic_quotes_gpc在php 5.3上已弃用选项
答案 2 :(得分:0)
是否有必要使用mysql_real_escape_string?
是。但不作为$_POST
或$_GET
的一揽子编码。这是将输出阶段转义机制应用于输入阶段,这是错误的,并会以意想不到的方式破坏你的字符串。
在将字符串插入另一个上下文之前,您应该将字符串保持为原始格式。仅在那个点,您使用适当的转义函数。使用MySQL:
$query= "SELECT * FROM items WHERE title='"+mysql_real_escape_string($_POST['title'])+"'";
或HTML:
<p>Title: <?php echo(htmlspecialchars($_POST['title'])) ?></p>
答案 3 :(得分:0)
我最近使用了PHP 5.3.6的托管,启用了“magic_quotes_gpc”选项。 不幸的是,这是一个共享主机,所以我无法更改配置(同样“php_flag magic_quotes_gpc关闭”到.htaccess失败)。
对我有用的代码级解决方案是将其置于开头
if (get_magic_quotes_gpc() === 1)
{
$_GET = json_decode(stripslashes(json_encode($_GET, JSON_HEX_APOS)), true);
$_POST = json_decode(stripslashes(json_encode($_POST, JSON_HEX_APOS)), true);
$_COOKIE = json_decode(stripslashes(json_encode($_COOKIE, JSON_HEX_APOS)), true);
$_REQUEST = json_decode(stripslashes(json_encode($_REQUEST, JSON_HEX_APOS)), true);
}
另见
答案 4 :(得分:0)
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);
}