为什么将magic_quotes_gpc视为不良做法?

时间:2010-04-09 20:01:07

标签: php magic-quotes-gpc

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

6 个答案:

答案 0 :(得分:13)

我认为我不能比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起已被删除。

答案 1 :(得分:3)

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

  • 将表单提交发送回浏览器的情况必须通过调用stripslashes()手动删除斜杠。
  • 如果此服务器的魔术引号被关闭,或者代码被移动到未启用魔术引号的服务器,则脚本将失败。或者更糟糕的是,不会立即失败,只表现出奇怪的行为。
  • 对提交的变量进行任何字符串操作,即使是简单的“if”语句也必须考虑到内容中斜线变形的可能性。
  • 魔术引语滋生了开发人员的邋。插入到SQL查询中的转义变量(在我看来)是开发人员应该知道和思考的东西。不只是假设一切都很花哨。

答案 2 :(得分:2)

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

尽管在PHP的未来版本中删除了该功能。

答案 3 :(得分:2)

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

如果O'Malley先生在您的网站上注册,那么magic_quotes_gpc会将他的姓氏变成O''Malley,当您将其插入数据库时​​,一切都会顺利。

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

如果没有启用magic_quotes,那么你将获得字符串O'Malley,它会破坏像

这样的SQL语句
INSERT INTO users (...) VALUES (...,'O'Malley',...)

请注意,字符串确实在O。

之后终止

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

(当然,对于真正安全的数据库处理代码,你需要使用参数化查询,因为这是防止SQL注入的最佳方法。如果你参数化,你不需要斜杠,而且它是让PHP添加它们是浪费时间。)

答案 4 :(得分:1)

“魔术行情”是PHP的手头控制,当他们不知道更好的情况时,防止开发人员用SQL注入自己的脚。它在PHP 5.3中已弃用,将在PHP 6中删除。

我说最好是明确并逃避需要转义的内容,而不是逃避所有内容并且不得不忘记永远不会放在数据库中的内容。魔术引号会产生与其解决的问题相同(或更多)的问题,以试图保护应该更了解的人。

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

答案 5 :(得分:1)

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