我一直在浏览PHP Internals 上的一些新闻组帖子,并发现了有关该主题的有趣讨论。最初的主题是关于其他的,但 PHP 世界的安全专家(如果不是 the)Stefan Esser 的评论将讨论转向在一些帖子中使用 $_REQUEST 的安全影响。
引用Stefan Esser on PHP Internals
$_REQUEST 是 PHP 中最大的设计缺陷之一。每个应用程序使用
$_REQUEST 很可能容易受到延迟跨站请求的影响
伪造问题。 (这基本上意味着,例如,一个名为 (age) 的 cookie
存在它将始终覆盖 GET/POST 内容,因此
将执行不需要的请求)
在later reply to the same thread
这与有人可以伪造 GET、POST 无关; COOKIE 变量。
这是关于 COOKIE 将覆盖 GET 和 POST 数据的事实
请求。
因此,我可以用一个 cookie 感染你的浏览器,例如
action=logout 并且从那天起您将无法使用该应用程序
因为 REQUEST[action] 将永远注销(直到你
手动删除cookie)。
用 COOKIE 感染你是如此简单......
a) 我可以在子域上的任何应用程序中使用 XSS 漏洞
b) 曾经尝试为 *.co.uk 或 *.co.kr 在您拥有
有单域吗?
c) 其他跨域的方式……
如果您认为这不是问题,那么我可以告诉您
有一个简单的可能性来设置 f.e.产生的 *.co.kr cookie
在几个 PHP 版本中只返回白页。
想象一下:只需一个 cookie 即可杀死 *.co.kr 中的所有 PHP 页面
并且通过在对 *.co.kr 有效的 cookie 中设置非法会话 ID
名为 +PHPSESSID=illegal 的变量,您仍然可以对每个 PHP 执行 DOS
在韩国使用 PHP 会话的应用程序...
讨论继续进行一些帖子,并且读起来很有趣。
如您所见,$_REQUEST 的主要问题不在于它有来自 $_GET 和 $_POST 的数据,还有来自 $_COOKIE 的数据。列表中的其他一些人建议更改填充 $_REQUEST 的顺序,例如首先用 $_COOKIE 填充它,但是 this could lead to numerous other potential problems, for instance with Session handling。
您可以完全从 $_REQUEST 全局中省略 $_COOKIES,这样它就不会被任何其他数组覆盖(实际上,您可以将其限制为标准内容的任何组合,例如 PHP manual on the variable_order ini setting 告诉我们:
variable_order 设置 EGPCS(Environment、Get、Post、Cookie 和 Server)变量解析的顺序。例如,如果 variables_order 设置为“SP”,那么 PHP 将创建超全局变量 $_SERVER 和 $_POST,但不会创建 $_ENV、$_GET 和 $_COOKIE。设置为 "" 意味着不会设置超全局变量。
但话又说回来,您也可以考虑完全不使用 $_REQUEST,因为在 PHP 中您可以在自己的全局变量中访问 Environment、Get、Post、Cookie 和 Server,并且减少了一个攻击向量。您仍然需要清理这些数据,但不必担心这一点。
现在您可能想知道,为什么 $_REQUEST 到底存在,为什么它没有被删除。这也是在 PHP Internals 上提出的。在 PHP Internals 上引用 Rasmus Lerdorf 关于Why does $_REQUEST exist?
我们删除的此类内容越多,人们就越难
快速迁移到更新、更快和更安全的 PHP 版本。那
比一些“丑陋”的遗产更让每个人感到沮丧
特征。如果有正当的技术原因,性能或
安全性,那么我们需要认真研究一下。在这种情况下,
我们应该关注的不是我们是否应该删除 $_REQUEST
但我们是否应该从中删除 cookie 数据。多种配置
已经这样做了,包括我自己的,并且有很强的有效性
在 $_REQUEST 中不包括 cookie 的安全原因。大多数人使用
$_REQUEST 表示 GET 或 POST,没有意识到它也可能包含
cookie,因此坏人可能会进行一些 cookie 注入
技巧并打破幼稚的应用程序。
无论如何,希望能有所启发。