为什么在PHP中开启magic_quotes_gpc被认为是一种不好的做法?
get_magic_quotes_gpc()
来检查,然后编写相应的代码。addslashes()
)更有效率。虽然php.ini-development默认启用这些指令,但php.ini-production则禁用它们。这种推荐主要是基于性能方面考虑的。stripslashes()
。注意 - 此功能已自PHP 5.3.0起被弃用,并在PHP 5.4.0中被删除。
不开启它可以迫使您编写更安全的代码。
如果O'Malley先生在您的网站上注册,那么magic_quotes_gpc将把他的姓氏转换为O\'Malley,当您将其插入数据库时,一切都会顺利进行。
问题是,magic_quotes来自于addslashes——这并不一定适用于您的数据库系统。O'Malley可能有效,但也可能绕过此转义并进行SQL注入。
如果没有开启magic_quotes,则会得到字符串O'Malley,并且它将破坏像
INSERT INTO users (...) VALUES (...,'O'Malley',...)
注意,在 O 后面的字符串确实已经终止了。
此外,更好的做法是:如果您想要发送一封包含他的名字的电子邮件,例如,您必须去掉反斜杠 - 没有任何好的理由。如果您不这样做,您将收到来自 O'Malley 先生的电子邮件。
(当然,对于真正安全的数据库处理代码,您应该使用参数化查询,因为这是防止 SQL 注入的最佳方法。而且如果您进行参数化,您也不需要斜杠,这样让 PHP 添加它们是浪费时间。)
\"Magic Quotes\" 是 PHP 的一种试图保护开发者免受 SQL 注入伤害的方式,当他们不知道更好的方法时进行手把手的指导。在 PHP 5.3 中已被弃用,并将在 PHP 6 中删除。
我认为更好的做法是明确地转义需要转义的内容,而不是转义 所有 内容,然后不得不反转义永远不会被放入数据库的内容。魔术引号试图保护那些本应该知道更好办法的人,但却创造了比解决更多的问题。
"