我最近在一个论坛中发现了一个帖子,其中有人询问如何实现超级全局变量的全局卫生,例如$ _GET,$ _POST,其余的甚至在它进入数据库之前。
你们怎么看待这种方法,因为我正在考虑实施这个方法,因为可能有一段时间我忘了做适当的卫生。
我在制作自己的课程之前也在寻找免费课程,但我找到的是PHP 3.0。
请array_walk_recursive
为我的目的做这份工作吗?
答案 0 :(得分:2)
实际上已经构建了php功能,可以在php中完成这个功能,名为magic_quotes_gpc。如果您在php.ini中将magic_quotes_gpc设置为on,它将为您执行此操作。然而,由于很多原因(参见this blog post,其中一个人写了优点/缺点)这被认为是一个坏主意,所有人都将其关闭并在他们进入数据库时回过头来引用内容通过为所有数据库查询使用数据库抽象层。想想PDO。既然你不知道添加额外引号会在哪里帮助或伤害你,你可以打开magic_quotes_gpc,但我不建议这样做。如果代码库需要维护,请以正确的方式进行维护,并开始使用PDO将原始sql拉出到调用中。
答案 1 :(得分:2)
在某个地方实际使用数据之前,请勿触摸超全球。例如....您不知道您是要插入数据库,还是输出到HTML页面,或构建一些Javascript,或其他什么。
一旦你开始使用超级球的内容,你会失去它们作为“原始”数据的来源,并开始撤消之前完成的工作。这就是为什么PHP自动转义表单数据是一个坏主意的一个原因 - 它假设你纯粹是在处理数据库而且永远不必将数据发送到其他地方:数据库转义与html转义不同是不一样的javascript转义与......等不一样......
同样,如果您正在构建一个模块或库以便在其他地方重复使用,那么您不能假设您对超全局的更改不会破坏其他库中的内容。
答案 2 :(得分:1)
如果你开始搞乱超级全局,那么你会遇到麻烦。例如,如果您确实希望将这段JavaScript存储在数据库中,该怎么办?
就个人而言,我认为用户输入卫生是一个坏主意。通常意味着,您最终会丢弃数据或使用大量转义字符或XML / HTML字符实体污染数据库。这只是一种处理数据的坏方法。
那么我们要通过消毒用户输入来避免哪些问题? SQL注入?使用参数化查询并完成它。但是代码注入怎么样?简单:消毒你的输出!将htmlspecialchars()(可能还有一些其他类似的函数)应用于来自数据库(或任何其他来源)的用户数据,并且您在保持原始数据完整的同时处理了该问题。额外的好处是,您可以随时调整您的卫生过程,并从中受益,不仅可以输入新数据,还可以获取所有现有数据。
答案 3 :(得分:0)
全球应用卫生设施的问题是,您基本上只能使用白名单或危险输入或逃避的黑名单。您无法在全局级别轻松实现类型检查,因为您的应用程序将如何知道各种输入应该是什么数据类型?
您将被限制搜索“< script>”等危险输入或者“删除表”等,或者逃避所有无法捕获所有漏洞的输入。
此外,很容易错过白名单中的内容,例如:特殊编码。