考虑文件 a.php
:
<?php
echo $_GET['a'];
?>
a.php?a=abcd'
打印 abcd\'
。
我认为 PHP 会自动转义引号,但我找不到关于此的文档。
这是真的吗?因为我想确定 - 我很懒,所以我没有在我的 PHP 源代码中阻止 SQL 注入(inject)......
最佳答案
这取决于你的php.ini
配置文件中的on
是否有magic_quotes_gpc
。
引入此配置指令是为了帮助开发人员保护自己免受 SQL injection 的侵害攻击。如果您不知道它们是什么,我建议您仔细阅读维基百科条目。
事情是,relying only on magic_quotes
is insecure and unpredictable , 并且在未来的 PHP 版本中也将删除此功能。防止 SQL 注入(inject)的最佳方法是使用准备好的语句(使用 PDO 或 MySQLi )或为您的数据库使用特定的转义函数:
但是,如果 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);
}
关于php - PHP 是否自动转义 GET 或 POST 传递的字符串中的引号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5801951/