php - PHP 是否自动转义 GET 或 POST 传递的字符串中的引号?

标签 php sql magic-quotes-gpc

考虑文件 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)的最佳方法是使用准备好的语句(使用 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,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/

相关文章:

php - mysqli_fetch_assoc()需要参数/调用成员函数bind_param()错误。如何获取并修复实际的mysql错误?

php - Google recaptcha 与我的 jquery/ajax 函数

sql - 在 Oracle/SQL 中预测时间序列数据

sql - 带有正则表达式的自定义 postgreSQL 域以接受一组特定的字符串

mysql - 如何在初始三个月/年和最后三个月/年之间选择 MySQL 中的行?

magento - 当 magic_quotes_gpc 设置为 off 时引号被转义

javascript - 如何使代码与其他标签一起使用并向其添加类?

php - 向 Codeigniter 表单验证添加自定义回调

php - 为启用了魔术引号的系统创建 real_escape_string() 方法