PHP中的魔术引号

Vir*_*dia 17 php security magic-quotes

根据PHP手册,为了使代码更具可移植性,他们建议使用以下内容来转义数据:

if (!get_magic_quotes_gpc()) {
    $lastname = addslashes($_POST['lastname']);
} else {
    $lastname = $_POST['lastname'];
}
Run Code Online (Sandbox Code Playgroud)

我还将进行其他验证检查,但上述严格来说,在逃避数据方面有多安全?我还看到在PHP 6中将不推荐使用魔术引号.这将如何影响上述代码?我宁愿不依赖于像mysql_real_escape_string()这样的特定于数据库的转义函数.

sk.*_*sk. 25

魔术引言本来就被打破了.它们旨在清理PHP脚本的输入,但不知道如何使用该输入,就无法正确清理.如果有的话,最好检查魔术引号是否已启用,然后在$ _GET/$ _ POST/$ _ COOKIES/$ _ REQUEST上调用stripslashes(),然后在某处使用它时清理变量.例如urlencode()如果你在URL中使用它,htmlentities()如果你将它打印回网页,或者使用数据库驱动程序的转义函数(如果你将它存储到数据库中).请注意,那些输入数组可能包含子数组,因此您可能需要编写一个函数可以递归到子数组中以去除这些斜杠.

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

"从PHP 5.3.0开始,此功能已被弃用,从PHP 5.4.0开始被删除.非常不鼓励依赖此功能.Magic Quotes是一个自动将传入数据转义为PHP脚本的过程.最好用魔法编码引用关闭,并根据需要在运行时转义数据."

  • 在PHP 5.4中删除 (4认同)
  • 除了PHP6从未见过光明的一天. (2认同)

Mar*_*rkR 17

魔术引号是一个设计错误.它们的使用与保持理智是不相容的.

我更喜欢:

if (get_magic_quotes_gpc()) {
   throw new Exception("Turn magic quotes off now!");
}
Run Code Online (Sandbox Code Playgroud)

不要编写与本质上破坏的设置兼容的代码.而是通过让代码快速失败来防止使用它们.


Jer*_*ten 6

我在我的网站的头文件中使用以下代码来反转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);
}

?>
Run Code Online (Sandbox Code Playgroud)

然后我可以编写其余的代码,好像magic_quotes从未存在过一样.