5

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

4

6 回答 6

15

我认为我不能比 PHP 本身的制造商更好地解释它(该页面上有后续评论):Why not to use Magic Quotes

  • 可移植性:假设它打开或关闭,都会影响可移植性。用于get_magic_quotes_gpc()检查这一点,并相应地编码。
  • 性能:因为不是每条转义数据都插入到数据库中,所以转义所有这些数据会有性能损失。在运行时简单地调用转义函数(如addslashes())更有效。虽然 php.ini-development 默认启用这些指令,但 php.ini-production 禁用它。这个建议主要是出于性能方面的原因。
  • 不便之处:因为并非所有数据都需要转义,所以在不应该出现的地方看到转义数据通常很烦人。例如,从表单发送电子邮件,并在电子邮件中看到一堆 \'。要解决此问题,这可能需要过度使用stripslashes().

注意 - 自 PHP 5.3.0 起,此功能已被弃用,自 PHP 5.4.0 起已移除。

于 2010-04-09T20:04:01.890 回答
3

根据文章What is Magic Quotes GPC (magic_quotes_gpc) in PHP 和 php.ini?,有很多缺点:

  • 将表单提交发送回浏览器的情况必须通过调用 stripslashes() 手动删除斜杠。
  • 如果此服务器关闭了魔术引号,或者将代码移动到未启用魔术引号的服务器,您的脚本将失败。或者更糟糕的是,不要立即失败,只会表现出奇怪的行为。
  • 对提交变量的任何字符串操作,甚至是简单的“if”语句都必须考虑到内容中斜线扭曲的可能性。
  • 魔术引语会滋生开发人员的马虎。转义插入到 SQL 查询中的变量(在我看来)是开发人员应该知道和考虑的事情。不只是假设一切都是花花公子。
于 2010-04-09T20:05:36.343 回答
2

因为有人可以将您的脚本移动到未启用该选项的服务器,从而立即在您的应用程序中打开数百个安全漏洞。此外,太多人认为启用魔术引号可以使您的应用程序安全。它不是。您仍然需要检查和验证进入应用程序的每一条输入。即使您没有报价问题,您仍然可能遇到跨站点脚本问题等。

尽管该功能在 PHP 的未来版本中被删除,但这一事实。

于 2010-04-09T20:05:42.883 回答
2

因为不使用它会迫使您编写更安全的代码。

如果O'Malley先生去你的网站注册,那么magic_quotes_gpc会把他的姓变成O\'Malley,当你把它插入数据库时​​,一切都会好起来的。

问题是,magic_quotes 来自addlashes - 它不一定可以作为您的数据库系统的转义。O'Malley 可能会起作用,但也有可能绕过这种转义并进行 SQL 注入。

如果 magic_quotes 没有打开,那么你会得到字符串 O'Malley,它会破坏一个 SQL 语句,比如

INSERT INTO users (...) VALUES (...,'O'Malley',...)

请注意,字符串实际上在 O 之后终止。

此外,它更好:例如,如果您要发送一封带有他名字的电子邮件,则必须使用斜杠 - 没有充分的理由。如果你不这样做,你会收到一封来自 O\'Malley 先生的电子邮件。

(当然,对于真正安全的数据库处理代码,你会想要使用参数化查询,因为这是防止 SQL 注入的最好方法。如果你参数化,你无论如何都不想要斜杠,这是浪费是时候让 PHP 添加它们了。)

于 2010-04-09T20:07:27.723 回答
1

“Magic Quotes”是 PHP 的手握尝试,防止开发人员在他们不知道更好的情况下用 SQL 注入击中自己的脚。它在 PHP 5.3 中已弃用,并将在 PHP 6 中删除。

我说最好是明确地逃避需要逃避的东西,而不是逃避一切而不得不逃避永远不会放在数据库中的东西。魔术引语产生的问题与它解决的问题一样多(或更多),以试图保护应该更了解的人。

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

于 2010-04-09T20:06:21.773 回答
1

很简单的问题。
假设您想通过电子邮件发送用户数据。或者将 cookie 中的用户名插入到表单输入中。你认为拥有像 Bob \"Buffalo\" Bill 这样的名字是个好主意吗?我不这么认为

于 2010-04-09T20:07:56.540 回答