考虑文件a.php
:
<?php
echo $_GET['a'];
?>
a.php?a=abcd'
打印abcd\'
。
我认为 PHP 自动转义引号,但我找不到有关此的文档。
这是真的吗?因为我想确保 - 我很懒,所以我没有阻止我的 PHP 源代码中的 SQL 注入......
考虑文件a.php
:
<?php
echo $_GET['a'];
?>
a.php?a=abcd'
打印abcd\'
。
我认为 PHP 自动转义引号,但我找不到有关此的文档。
这是真的吗?因为我想确保 - 我很懒,所以我没有阻止我的 PHP 源代码中的 SQL 注入......
如果magic_quotes_gpc在配置中处于活动状态,PHP 会执行此操作。此功能已弃用,将来会消失。在编写新代码时依赖已弃用的功能是不好的(实际上,这完全是愚蠢的)。
请注意,魔术引号不足以防止 SQL 注入,因为它不能正确处理所有字符集。我建议您反转魔术引用并改用 mysql_real_escape_string (或其他数据库扩展中的类似内容)。
这取决于是否magic_quotes_gpc
在On
您的php.ini
配置文件中。
引入此配置指令是为了帮助开发人员保护自己免受SQL 注入攻击。如果您不知道它们是什么,我建议您仔细阅读 Wikipedia 条目。
问题是,仅依赖magic_quotes
是不安全和不可预测的,而且这个特性也将在未来的 PHP 版本中被移除。防止 SQL 注入的最佳方法是使用准备好的语句(使用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,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);
}
您需要更新代码以正确转义 SQL 输入。或者更好的是,使用 PDO,这样您就可以将查询参数与查询分开传递。
虽然 PHP 有magic_quotes_gpc
,但默认情况下它是禁用的,并将在 PHP 6 中删除。除此之外,它是一个可怕的混乱,导致潜在的不安全或错误的代码,因此如果是,最好删除自动添加的引号。get_magic_quotes_gpc()
true
mysqli_real_escape_string()是一个好的开始。