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