3

考虑文件a.php

<?php
    echo $_GET['a'];
?>

a.php?a=abcd'打印abcd\'

我认为 PHP 自动转义引号,但我找不到有关此的文档。

这是真的吗?因为我想确保 - 我很懒,所以我没有阻止我的 PHP 源代码中的 SQL 注入......

4

4 回答 4

3

如果magic_quotes_gpc在配置中处于活动状态,PHP 会执行此操作。此功能已弃用,将来会消失。在编写新代码时依赖已弃用的功能是不好的(实际上,这完全是愚蠢的)。

请注意,魔术引号不足以防止 SQL 注入,因为它不能正确处理所有字符集。我建议您反转魔术引用并改用 mysql_real_escape_string (或其他数据库扩展中的类似内容)。

于 2011-04-27T09:29:16.990 回答
3

这取决于是否magic_quotes_gpcOn您的php.ini配置文件中。

引入此配置指令是为了帮助开发人员保护自己免受SQL 注入攻击。如果您不知道它们是什么,我建议您仔细阅读 Wikipedia 条目。

问题是,仅依赖magic_quotes是不安全和不可预测的,而且这个特性也将在未来的 PHP 版本中被移除。防止 SQL 注入的最佳方法是使用准备好的语句(使用PDOMySQLi)或为您的数据库使用特定的转义函数:

但是,如果magic_quotes打开并且您尝试转义输入数据,您可能会得到一个双转义字符串(这不好),为了抵消这种情况,我们通常会检测是否magic_quotesOn,如果是,则通过删除添加的斜杠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);
}
于 2011-04-27T09:46:04.843 回答
1

需要更新代码以正确转义 SQL 输入。或者更好的是,使用 PDO,这样您就可以将查询参数与查询分开传递。

虽然 PHP 有magic_quotes_gpc,但默认情况下它是禁用的,并将在 PHP 6 中删除。除此之外,它是一个可怕的混乱,导致潜在的不安全或错误的代码,因此如果是,最好删除自动添加的引号。get_magic_quotes_gpc()true

于 2011-04-27T09:30:24.620 回答
0

mysqli_real_escape_string()是一个好的开始。

于 2011-04-27T09:36:45.667 回答