我最近遇到了几个流行的 PHP 相关答案,建议使用 superglobal $_REQUEST
,我认为这是代码异味,因为它让我想起了register_globals
.
您能否提供一个很好的解释/证据来说明为什么$_REQUEST
是不好的做法?我将抛出一些我已经挖掘出来的示例,并且希望获得有关理论攻击向量和现实世界漏洞的更多信息/观点,以及系统管理员可以采取的合理步骤以降低风险的建议(缺少重写应用程序......或者,我们是否需要去管理层并坚持重写?)。
漏洞示例:默认GPC
数组合并顺序意味着 COOKIE 值覆盖 GET 和 POST,因此$_REQUEST
可用于 XSS 和 HTTP 攻击。PHP 让 cookie 变量覆盖超全局数组。本演讲的前 10 张幻灯片给出了示例(整个演讲很棒)。phpMyAdmin 利用CSRF 攻击示例。
对策示例:重新配置$_REQUEST
数组合并顺序 from GPC
以CGP
使 GET/POST 覆盖 COOKIE,而不是相反。使用Suhosin阻止覆盖超全局变量。
(另外,不会问我是否认为我的问题是骗人的,但令人高兴的是,对于“何时以及为什么应该使用 $_REQUEST 而不是 $_GET / $_POST / $_COOKIE?”的压倒性 SO 答案是“从不”。 )