file_get_contents和readfile是否执行PHP代码?

时间:2016-04-07 23:24:05

标签: php security

我始终确保PHP函数file_get_contentsreadfile在任何文件中执行任何PHP代码 - 无论文件类型如何 - 都是给它的。我在多个设置上尝试了这个,它总能工作。

我收到了有关此here的问题,用户似乎认为情况并非如此。

我查看了PHP文档中的函数,并没有提到代码执行(如果通常情况下这是我期望的,因为它具有严重的安全隐患)。

我也搜索过它,并发现很多声称这些函数不执行PHP代码。例如:

  

readfile不会执行服务器上的代码,因此没有问题。 source

搜索" php file_get_contents代码执行"还会返回尝试执行检索到的PHP代码的各种问题,如果它确实通常会执行任何给定的PHP代码,这似乎很奇怪。

我还发现one question询问不执行PHP代码,因此执行似乎也会发生在其他人身上。

所以我的问题是:

  • 执行函数file_get_contentsreadfile在检索到的文件中执行PHP代码?
  • 这取决于一些php.ini设置吗?如果是,那么设置是什么?
  • 是否依赖于PHP版本,如果是,哪些版本会受到影响?
  • 如果通常不是这样,那么他们在我的设置中执行PHP代码的原因可能是什么?

2 个答案:

答案 0 :(得分:8)

file_get_contentsreadfile 不执行代码。他们只是返回文件的原始内容。这可以是文本,PHP代码,二进制(例如图像文件)或其他任何东西。根本没有对文件内容的解释。

可能出现的唯一情况就像执行一样:

  1. <?php ?>标记可能会被浏览器隐藏,因为它试图将它们解释为HTML标记,因此这可能会导致PHP消失,因此可能已被执行。
  2. 您正在从执行代码的来源中读取,例如从http://example.com/foo.php阅读时。在这种情况下,这些函数与在Web浏览器中访问这些URL具有相同的效果:服务Web服务器正在执行PHP代码并返回结果,但file_get_contents仅获取该结果并将其返回。

答案 1 :(得分:6)

这些函数在本手册的«函数参考/文件系统相关扩展/文件系统»部分中描述,而执行代码的函数在«函数参考/过程控制扩展中描述»

我很确定这种误解来自文件系统和网络之间的某种广泛的混淆,而且PHP流功能提供了更糟糕的功能,它提供了允许使用相同功能透明地打开任何类型资源的协议包装器:本地文件,网络资源,压缩档案等。我在这里看到无数的帖子,有人做这样的事情:

file_get_contents('http://example.com/inc/database.inc.php');

...并且想知道为什么他看不到这个数据库连接。答案很清楚:你没有加载文件,你正在获取一个URL。结果,database.inc.php内的代码得到了有效执行......而非间接执行。