为什么包含('php:// input')不起作用?

Nik*_* B. 7 php security

想象一下,玩具PHP应用程序易受绝对本地文件包含的影响,例如

<?php include($_GET['action']);
Run Code Online (Sandbox Code Playgroud)

我尝试了以下请求来利用它:

POST /?action=php://input HTTP/1.1
Host: XXXXXXXXXXXXXXXXX
Content-Length: 3

foo
Run Code Online (Sandbox Code Playgroud)

这有效地执行include('php://input');请求正文foo,所以我希望它打印foo.但是,我收到以下错误

<br />
<b>Warning</b>:  include(php://input): failed to open stream: operation failed in <b>XXXXXXXXXXXXXXXXX</b> on line <b>12</b><br />
<br />
<b>Warning</b>:  include(): Failed opening 'php://input' for inclusion (include_path='.:/usr/share/php:/usr/share/pear') in <b>XXXXXXXXXXXXXXXXXXX</b> on line <b>12</b><br />
Run Code Online (Sandbox Code Playgroud)

这是什么问题?这是PHP安全功能吗?如果是这样,有人可以指向PHP源代码的负责部分来缓解这种情况吗?

Nik*_* B. 3

我在Gustek的帮助下找到了答案。显然php://input受到 的限制allow_url_include,而例如则php://filter不受:

受allow_url_include 限制:仅限 php://input、php://stdin、php://memory 和 php://temp。

来源:URL 处理程序文档php://