我一直在研究有关PHP Internals的一些新闻组帖子,并找到了关于该主题的有趣讨论。初始线程是别的事情,但此话出自Stefan Esser,如果一个(如果不是该在PHP世界)的安全专家转向使用$ _REQUEST几个职位的安全性问题的讨论。
在PHP Internals上引用Stefan Esser
$ _REQUEST是PHP中最大的设计弱点之一。每个使用$ _REQUEST的应用程序很可能容易受到“跨站点请求伪造”问题的影响。(这基本上意味着,例如,如果存在一个名为(age)的cookie,它将始终覆盖GET / POST内容,因此将执行不需要的请求)
并在以后回复同一主题
这与某人可以伪造GET,POST无关;COOKIE变量。关于COOKIE将覆盖REQUEST中的GET和POST数据这一事实。
因此,我可能会用一个说“ action = logout”的cookie感染您的浏览器,并且从那天起您将无法再使用该应用程序,因为REQUEST [action]将永远注销(直到您手动删除cookie)。
用COOKIE感染您非常简单...
a)我可以在子域上的任何应用程序中使用XSS vuln
b)曾经尝试在拥有* .co.uk或* .co.kr时设置cookie单域?
c)其他跨域方式...
如果您认为这不是问题,那么我可以告诉您,可以简单地将fe设置为* .co.kr cookie,从而导致多个PHP版本仅返回白页。想象一下:只需一个cookie即可杀死* .co.kr中的所有PHP页面
并且通过在一个有效于* .co.kr的cookie中为一个名为+ PHPSESSID = 非法的变量设置一个非法的会话ID,您仍然可以使用PHP会话来DOS DOS韩国的每个PHP应用程序...
讨论仍在继续,还有更多的帖子,阅读起来很有趣。
如您所见,$ _ REQUEST的主要问题不仅仅在于它具有来自$ _GET和$ _POST的数据,而且还具有来自$ _COOKIE的数据。列表中的其他一些人建议更改$ _REQUEST的填充顺序,例如,先用$ _COOKIE填充它,但这可能导致许多其他潜在的问题,例如会话处理。
您可以从$ _REQUEST全局变量中完全省略$ _COOKIES,这样它就不会被其他任何数组覆盖(实际上,您可以将其限制为标准内容的任意组合,例如variable_order ini设置上的PHP手册)告诉我们:
variable_order设置EGPCS(环境,获取,发布,Cookie和服务器)变量解析的顺序。例如,如果variables_order设置为“ SP”,则PHP将创建超全局变量$ _SERVER和$ _POST,但不会创建$ _ENV,$ _ GET和$ _COOKIE。设置为“”表示将不设置任何超全局变量。
但是再说一遍,您可能还考虑不完全使用$ _REQUEST,这仅仅是因为在PHP中,您可以在自己的全局变量中访问Environment,Get,Post,Cookie和Server,并且攻击向量更少。您仍然必须清理这些数据,但是不必担心。
现在您可能想知道,为什么$ _REQUEST毕竟存在,为什么不删除它。这也是在PHP Internals上提出的。引用拉斯穆斯·勒多夫(Rasmus Lerdorf)的原因,为什么存在$ _REQUEST?在PHP内部
我们删除的此类内容越多,人们越难快速迁移到更新,更快,更安全的PHP版本。与一些“丑陋”的遗留功能相比,这给每个人带来更多的挫败感。如果有合理的技术原因,性能或安全性,那么我们需要认真研究一下。在这种情况下,我们应该考虑的事情不是是否应该删除$ _REQUEST,而是是否应该从中删除cookie数据。许多配置已经做到了这一点,包括我所有的配置,并且出于充分的安全考虑,没有在$ _REQUEST中包含cookie是非常有力的安全理由。大多数人使用$ _REQUEST表示GET或POST,但没有意识到它也可能包含cookie,因此,这些坏家伙可能会做一些cookie注入技巧并破坏朴素的应用程序。
无论如何,希望能有所启发。