为什么开启magic_quotes_gpc被认为是一种不良实践?

5
为什么在PHP中开启magic_quotes_gpc被认为是一种不好的做法?

2
嗯,可能是因为它在PHP 6.0中被移除并且在PHP 5.3中已经被弃用了吧? :P - Noah Goodrich
3
这是个先有鸡还是先有蛋的问题。这个功能是否被移除是因为一开始就是不好的做法?大多数人可能会认同这种观点。 - Billy ONeal
@Noah Goodrich 你是说"或许"还是确定呢? - Itay Moav -Malimovka
@Billy O'Neal - 碰到你了。 @Itay Moav - 这绝对是确定的。这是一种不好的做法,因此正在被删除。我相信你现在已经确定了。 :) - Noah Goodrich
6个回答

15
我认为我无法比PHP本身的开发者(以及该页面上的后续评论)更好地解释这个问题:为什么不使用魔术引号(Magic Quotes)
  • 可移植性: 假设它打开或关闭都会影响可移植性。使用get_magic_quotes_gpc()来检查,然后编写相应的代码。
  • 性能: 由于并非所有转义后的数据都被插入数据库中,因此转义所有这些数据会导致性能损失。在运行时简单地调用转义函数(如addslashes())更有效率。虽然php.ini-development默认启用这些指令,但php.ini-production则禁用它们。这种推荐主要是基于性能方面考虑的。
  • 不便:因为不是所有数据都需要转义,所以在不应该出现转义数据的地方看到转义数据通常很烦人。例如,在从表单发送电子邮件时,在电子邮件中看到一堆\'。要解决这个问题,可能需要过多地使用stripslashes()

注意 - 此功能已自PHP 5.3.0起被弃用,并在PHP 5.4.0中被删除。


即使数据已插入数据库,magic_quotes_gpc/addslashes 也可能无法解决问题。 - VolkerK

3
根据文章什么是 PHP 中的 Magic Quotes GPC (magic_quotes_gpc) 和 php.ini?,有许多缺点:
  • 在表单提交返回到浏览器的情况下,必须手动调用stripslashes()函数来删除反斜杠。
  • 如果该服务器上关闭了魔术引号或者移动代码到不支持魔术引号的服务器,你的脚本将会出错。更糟糕的是,可能不会立即失败,只会表现为奇怪的行为。
  • 对于提交的变量进行任何字符串操作,即使是简单的“if”语句,也必须考虑到内容中反斜线扭曲的可能性。
  • 魔术引号培养了开发人员的懒惰。转义插入到SQL查询中的变量(在我看来)是开发人员应该知道和考虑的事情。而不是假设一切都很好。

2
由于某些人可能会将您的脚本移动到未启用该选项的服务器上,从而在应用程序中立即打开数百个安全漏洞。此外,太多人认为启用魔术引号可以使您的应用程序变得更安全。但事实并非如此。您仍然需要检查和验证进入应用程序的每个输入。即使您没有引号问题,您仍然可能遇到跨站点脚本等问题。
尽管如此,在未来版本的PHP中删除此功能的事实并不包括在内。

2

不开启它可以迫使您编写更安全的代码。

如果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 添加它们是浪费时间。)


1
"

\"Magic Quotes\" 是 PHP 的一种试图保护开发者免受 SQL 注入伤害的方式,当他们不知道更好的方法时进行手把手的指导。在 PHP 5.3 中已被弃用,并将在 PHP 6 中删除。

我认为更好的做法是明确地转义需要转义的内容,而不是转义 所有 内容,然后不得不反转义永远不会被放入数据库的内容。魔术引号试图保护那些本应该知道更好办法的人,但却创造了比解决更多的问题。

"

http://us3.php.net/manual/en/security.magicquotes.php


1
非常简单的问题。
想象一下,您想通过电子邮件发送用户数据,或者将来自 cookie 的用户名称插入到表单输入中。您认为使用像 Bob “Buffalo” Bill 这样的名称会是个好主意吗?我不这么认为。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接