为什么在PHP中启用magic_quotes_gpc被认为是不好的做法?为什么把magic_quotes_gpc视为一种不好的做法?
回答
我不认为我能解释它比任何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以前已被删除。
即使将数据_is_插入到数据库magic \ _quotes \ _gpc/addslashes中也可能无法实现。 – VolkerK 2010-04-09 20:06:28
根据文章What is Magic Quotes GPC (magic_quotes_gpc) in PHP and the php.ini?,也有许多缺点:其中表单提交被发送回浏览器必须()与呼叫手动移除的stripslashes斜线
- 案件。
- 如果此服务器的魔术引号被关闭,或者代码被移动到未启用魔术引号的服务器,则您的脚本将失败。或者更糟的是,不会立即失败,只会表现出奇怪的行为
- 对提交的变量进行任何字符串操作,即使是简单的'if'语句都必须考虑到内容中的斜杠变形的可能性。
- 魔术引号引起开发者的sl。。插入到SQL查询中的转义变量(在我看来)是开发人员应该知道并思考的东西。不仅仅是假设一切都是华丽的。
因为有人可以将您的脚本移动到未启用该选项的服务器,因此在应用程序中立即打开数百个安全漏洞。另外,太多认为启用魔术引号会使您的应用程序安全。它不是。您仍然需要检查并验证进入应用程序的每一个输入。即使您没有报价问题,仍然可能存在跨站点脚本问题等。
即使未来版本的PHP中正在删除该功能的事实。
“Magic Quotes”是PHP手头持有的尝试,防止开发人员在不知情的情况下用SQL注入自己的脚步。它弃用PHP 5.3,并且将在PHP被删除6.
我说,最好是明确和逃生需要转义,而不是逃避一切并有反转义的事情,永远不会被放在什么数据库。魔术报价创造了很多(或更多)问题,而不是解决问题,试图屏蔽那些应该更好地了解的人。
因为离开它脱力你写出更安全的代码。
如果O'Malley先生在您的网站上注册,那么magic_quotes_gpc会将他的姓氏变成O \'Malley,并且当您将其插入到数据库中时,一切都会好起来的。
问题是,magic_quotes来自addslashes--它不一定会作为数据库系统的转义工作。 O'Malley可能会工作,但也可以规避这种逃跑并执行SQL注入。
如果magic_quotes的都没有,那么你会得到字符串奥马利,这将打破SQL语句像
INSERT INTO users (...) VALUES (...,'O'Malley',...)
通知的字符串是O.
后真的终止此外,它更好:例如,如果您要用他的名字发送电子邮件,则必须使用反斜杠 - 没有理由。如果你不知道,你会收到O'Malley先生的电子邮件。 (当然,对于真正安全的数据库处理代码,你会希望使用参数化查询,因为这是防止SQL注入的最佳方法,而且如果你参数化,你不需要斜杠,并且这是浪费时间让PHP添加它们。)
很容易的问题。
想象一下,你想通过电子邮件发送用户的数据。或者将cookie中的用户名插入到表单输入中。你觉得像鲍勃“布法罗”比尔这样的名字会是个好主意吗?我不这么认为
- 1. Javascript为什么FOR IN是一种不好的做法?
- 2. 为什么-compile(export_all)不好的做法?
- 3. 为什么在JavaScript中使用“const”构造是一种不好的做法?
- 4. 为什么在HTML中使用onClick()是一种不好的做法?
- 5. 为什么从javascript连接SQL数据库是一种不好的做法?
- 6. 为什么是一种“不稳定的那种”认为是不好的
- 7. 哪种方法签名好,为什么?
- 8. 哪种方法更好,为什么?
- 9. 为什么把所有的html放在一行上都不好?
- 10. 为什么在bean中创建受保护的属性被认为是一种不好的做法?
- 11. 为什么关闭Angular的良好做法? (或一般)?
- 12. 不好的做法?它是什么“称为”
- 13. 为什么不把UIViewController的视图键入为id?
- 14. 为什么在C++的函数中创建一个对象是一种不好的做法?
- 15. 为什么QWebFrame :: evalutateJavaScript在这种情况下什么都不做?
- 16. 使用Firebase Auth user.uid作为url的一部分是一种不好的做法?
- 17. 将变量设置为“Nothing”是一种很好的做法?
- 18. 将变量声明为'var'是一种好的做法吗?
- 19. 为什么Visual Studio中的循环引用是一个不好的做法?
- 20. 这是为什么认为是不好的做法?还是它? (ASP.Net)
- 21. 为什么重载operator <作为成员函数是不好的做法?
- 22. 锁定可变对象 - 为什么它被认为是不好的做法?
- 23. 为什么锁定我们要改变的对象是一种不好的做法?
- 24. 为什么将文件存储在数据库表中不是一种好的做法?
- 25. instanceof是一种好的做法吗?
- 26. 认为是好的做法?
- 27. 在什么情况下静态方法是一种好的做法?
- 28. 这种做法叫做什么? `objectName && objectName.thing`
- 29. 在SQL中更新视图是一种好的做法吗?
- 30. 保持交易开放被认为是一种不好的做法?
嗯..因为它在PHP6.0中被删除,并且从PHP5.3开始被弃用了呢? :P – 2010-04-09 20:04:38
@Noah Goodrich:这是一个鸡与鸡蛋的问题。该功能是否被删除,因为开始时是不好的做法?大多数人可能会认为是。 – 2010-04-09 20:07:08
@Noah Goodrich是“可能”,或者你确定? – 2010-04-09 20:10:06