根据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(),然后在某处使用它时清理变量.例如urlencode()如果你在URL中使用它,htmlentities()如果你将它打印回网页,或者使用数据库驱动程序的转义函数(如果你将它存储到数据库中).请注意,那些输入数组可能包含子数组,因此您可能需要编写一个函数可以递归到子数组中以去除这些斜杠.
关于魔术引号的PHP 手册页同意:
"从PHP 5.3.0开始,此功能已被弃用,从PHP 5.4.0开始被删除.非常不鼓励依赖此功能.Magic Quotes是一个自动将传入数据转义为PHP脚本的过程.最好用魔法编码引用关闭,并根据需要在运行时转义数据."
魔术引号是一个设计错误.它们的使用与保持理智是不相容的.
我更喜欢:
if (get_magic_quotes_gpc()) { throw new Exception("Turn magic quotes off now!"); }
不要编写与本质上破坏的设置兼容的代码.而是通过让代码快速失败来防止使用它们.
我在我的网站的头文件中使用以下代码来反转magic_quotes的效果:
$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从未存在过一样.