我最近发现了几个与PHP相关的流行答案,建议使用超全球$_REQUEST
,我认为它是代码味道,因为它让我想起了register_globals
.
你能提供一个很好的解释/证据,说明为什么$_REQUEST
不好的做法?我将抛出一些我挖出的例子,并希望获得关于理论攻击向量和现实漏洞的更多信息/观点,以及系统管理员可以采取的合理步骤的建议,以降低风险(缺少重写应用程序......或者,我们是否需要去管理层并坚持重写?).
漏洞示例:默认GPC
阵列合并顺序意味着COOKIE值覆盖GET和POST,因此$_REQUEST
可用于XSS和HTTP攻击.PHP允许cookie变量覆盖超全局数组.本讲座的前10张幻灯片给出了一些例子(整个讲座很棒).phpMyAdmin利用 CSRF攻击的例子.
示例对策:重新配置$_REQUEST
数组合并顺序 GPC
从而CGP
使GET/POST覆盖COOKIE,而不是反过来.使用Suhosin阻止覆盖超全球.
(另外,不会问我是否认为我的问题是一个骗局,但很高兴得到压倒性的回答"何时以及为什么要使用$ _REQUEST而不是$ _GET/$ _POST/$ _COOKIE?"是"从不". )
只需按原样对待:从用户获取数据的方法.它必须经过消毒和验证,那么你为什么要关心它是以POST,GET还是cookie的形式出现的呢?它们都来自用户,所以说'他们可以被欺骗!' 是多余的.
$ _REQUEST是一个邪恶的$ _GET,$ _POST和$ _COOKIE.虽然我认为有使用$ _REQUEST的有效方案,但有一个很好的理由不使用$ _REQUEST并将其标记为"不良做法".
使用$ _REQUEST的主要原因是参数可以在$ _POST或$ _GET中传输.通过访问$ _REQUEST,您不必同时检查$ _GET和$ _POST值.问题是ini设置gpc_order可以改变构建$ _REQUEST的行为.此设置可能因服务器而异,您的脚本可能会更改行为.
$_REQUEST
是有问题的,因为它忽略了URL($_GET
)和请求body($_POST
)之间的区别.HTTP-GET请求应该没有副作用,而HTTP-POST可能有副作用,因此无法缓存.将这些完全不同的数据源放入一个存储桶中,需要调用非REST -ful的应用程序,即不良应用程序.