根据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 5.4.0起已取消。强烈不建议使用此功能。Magic Quotes是一种自动将输入数据转义到PHP脚本的过程。首选使用Magic进行编码引用,然后根据需要在运行时转义数据。”