为什么在PHP中启用magic_quotes_gpc被认为是一种不好的做法?
答案 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?,有许多缺点:
答案 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中删除。
我说最好是明确并逃避需要转义的内容,而不是逃避所有内容并且不得不忘记永远不会放在数据库中的内容。魔术引号会产生与其解决的问题相同(或更多)的问题,以试图保护应该更了解的人。
答案 5 :(得分:1)
非常简单的问题 想象一下,您想通过电子邮件发送用户的数据。或者将cookie中的用户名插入表单输入中。你觉得像Bob“Buffalo”Bill这样的名字是个好主意吗?我不这么认为