PHP中的魔术引号

根据PHP手册,为了使代码更具可移植性,他们推荐使用类似以下的方式来转义数据:

if (!get_magic_quotes_gpc()) {
    $lastname = addslashes($_POST['lastname']);
} else {
    $lastname = $_POST['lastname'];
}

我还会执行其他验证检查,但严格地说,在转义数据方面上述安全性如何? 我还看到,魔术引号将在PHP 6中被弃用。这将如何影响上述代码? 我宁愿不必依赖数据库特定的转义函数,如mysql_real_escape_string()。


魔术报价内在地被打破。 他们的目的是消除PHP脚本的输入,但不知道如何使用输入,不可能正确消毒。 如果有的话,最好检查是否启用了魔术引号,然后在$ _GET / $ _ POST / $ _ COOKIES / $ _ REQUEST上调用stripslashes(),然后在某处使用它的地方清理变量。 例如,如果您在URL中使用urlencode(),如果将它打印回网页,则使用htmlentities();如果将数据库驱动程序存储到数据库中,则使用数据库驱动程序的转义函数。 请注意,这些输入数组可能包含子数组,因此您可能需要编写一个函数才能递归到子数组中去除这些斜线。

关于魔术引号的PHP手册页同意:

“这个特性从PHP 5.3.0开始已经被拒绝了,从PHP 6.0.0开始已经被删除了。依赖这个特性是非常不鼓励的。Magic Quotes是一个自动将进入的数据转义到PHP脚本的进程。引用关闭,并在运行时根据需要转义数据。“


魔术引号是一个设计错误。 他们的使用不符合保留您的理智。

我更喜欢:

if (get_magic_quotes_gpc()) {
   throw new Exception("Turn magic quotes off now!");
}

不要为了与固有的破坏设置兼容而编写代码。 相反,通过让你的代码失败快速来捍卫他们的使用。


我在我的网站的头文件中使用以下代码来反转magic_quotes的效果:

<?php

// Strips slashes recursively only up to 3 levels to prevent attackers from
// causing a stack overflow error.
function stripslashes_array(&$array, $iterations=0) {
    if ($iterations < 3) {
        foreach ($array as $key => $value) {
            if (is_array($value)) {
                stripslashes_array($array[$key], $iterations + 1);
            } else {
                $array[$key] = stripslashes($array[$key]);
            }
        }
    }
}

if (get_magic_quotes_gpc()) {
    stripslashes_array($_GET);
    stripslashes_array($_POST);
    stripslashes_array($_COOKIE);
}

?>

然后,我可以编写剩余的代码,就好像magic_quotes从不存在一样。

链接地址: http://www.djcxy.com/p/26565.html

上一篇: Magic quotes in PHP

下一篇: How to turn off magic quotes gpc for Joomla 3?