考虑a.php只会:PHP会自动转义GET或POST传递的字符串中的引号吗?
<?php
echo $_GET['a'];
?>
a.php?a=abcd'
打印abcd\'
。
我认为PHP自动转义引号,但是我找不到关于此的文档。
这是真的吗?因为我想确保 - 我很懒,所以我没有阻止我的PHP源代码中的SQLI ..
考虑a.php只会:PHP会自动转义GET或POST传递的字符串中的引号吗?
<?php
echo $_GET['a'];
?>
a.php?a=abcd'
打印abcd\'
。
我认为PHP自动转义引号,但是我找不到关于此的文档。
这是真的吗?因为我想确保 - 我很懒,所以我没有阻止我的PHP源代码中的SQLI ..
取决于是否在On
magic_quotes_gpc
或不上你的php.ini
配置文件。
这个配置指令被引入来帮助开发者保护自己免受攻击,如果你不知道他们是什么,我建议你非常仔细地阅读维基百科条目。
的事情是,relying only on magic_quotes
is insecure and unpredictable,而这一功能也将在未来的PHP版本删除,以确保针对SQL注入的最佳方式是要么使用准备好的语句(与PDO或MySQLi),或使用特定避开功能为您数据库:
然而,我f magic_quotes
已打开,并且您尝试逃离输入数据的机会是您将得到一个双转义字符串(这不好),为了对抗此行为,我们通常会检测magic_quotes
是On
,如果是,则删除添加的斜杠通过stripslashes()
。
在调用数据库转义函数/方法之前,有些人会这样做,但我个人更喜欢在页面加载时执行此操作,因为这会使数据更加一致并且不易出错,如果您使用PHP 5.3+下面的代码片段应禁用magic_quotes
:
if (get_magic_quotes_gpc() === 1)
{
$_GET = json_decode(stripslashes(preg_replace('~\\\(?:0|a|b|f|n|r|t|v)~', '\\\$0', json_encode($_GET, JSON_HEX_APOS | JSON_HEX_QUOT))), true);
$_POST = json_decode(stripslashes(preg_replace('~\\\(?:0|a|b|f|n|r|t|v)~', '\\\$0', json_encode($_POST, JSON_HEX_APOS | JSON_HEX_QUOT))), true);
$_COOKIE = json_decode(stripslashes(preg_replace('~\\\(?:0|a|b|f|n|r|t|v)~', '\\\$0', json_encode($_COOKIE, JSON_HEX_APOS | JSON_HEX_QUOT))), true);
$_REQUEST = json_decode(stripslashes(preg_replace('~\\\(?:0|a|b|f|n|r|t|v)~', '\\\$0', json_encode($_REQUEST, JSON_HEX_APOS | JSON_HEX_QUOT))), true);
}
如果您运行的是旧版本的PHP,the PHP Manual has a fairly good snippet too:
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);
}
我认为你的第一个编码块不必要的慢,也是无法解释的。 JSON编码和解码加正则表达式并不是特别快。从手册来看,第二种解决方案更加简洁(恕我直言),并且不会混淆奇怪的黑客。 – 2011-04-27 10:37:12
@Emil:我不认为它是无法解释的......带有JSON_HEX_APOS和JSON_HEX_QUOT标志的'json_encode()'确保单引号和双引号都被转义,因为控制字符也被转义了,所以我们使用正则表达式来添加一个额外的斜杠,然后通过'stripslashes()'移除多余的,然后'json_decode()'应该将超级全局键和值解码回数组。至于速度,我还没有测试过,但现在JSON函数非常快,如果有什么重大区别,我会很惊讶。 – 2011-04-27 10:53:21
如果magic_quotes_gpc在配置中处于活动状态,PHP会执行此操作。此功能已被弃用,并将在未来消失。在编写新代码时依赖于不推荐使用的功能并不好(实际上,这完全是愚蠢的)。
请注意,魔术引号不足以防止SQL注入,因为它不能正确处理所有字符集。我建议您使用invert the magic quoting,并使用mysql_real_escape_string(或其他数据库扩展中的类似代码)。
+1您也可以尝试在您的.htaccess文件中添加'php_flag magic_quotes_gpc Off'来关闭此功能(对于.htaccess所在的特定目录)。你也可以在php.ini或httpd.conf中关闭它,如果你有权访问那些(在这种情况下,它将在整个服务器上关闭)。 – kapa 2011-04-27 09:42:30
您需要更新您的代码,以便正确转义您的SQL输入。或者甚至更好,使用PDO,以便可以将查询参数与查询分开传递。
虽然PHP有magic_quotes_gpc
默认情况下它被禁用,并且将在PHP6中删除。除此之外,这是一个可怕的混乱,导致潜在的不安全或错误的代码,因此,如果get_magic_quotes_gpc()
是true
,删除自动添加报价更好。
mysqli_real_escape_string()是一个良好的开端
magic_quotes的目的不是为安全功能,而仅仅是为了使SQL工作开箱。 [(1)](http://www.php.net/manual/phpfi2.php#msql_support)由于意外,它在PHP2/PHP3周围是安全的,因为大多数使用的数据库不适用于多字节字符集。但除非你确保你的应用程序/数据库连接只接收ASCII,否则你将不得不适应这种情况。 – mario 2011-04-27 09:37:27