2016-04-07 74 views
5

我总是确信PHP函数file_get_contentsreadfile在任何文件中执行任何PHP代码 - 无论文件类型如何 - 都会被赋予它。我在多个设置上尝试了这个,并且它一直工作。做file_get_contents和readfile执行PHP代码?

我收到了关于这个here一个问题,用户似乎认为这种情况并非如此。

我看着的函数的PHP文件,他们不提代码执行(这是一件好事,如果这通常是这种情况,因为它有严重的安全隐患,我所期望的)。

我也搜索了它,并发现了大量的功能不执行PHP代码索赔。例如:

readfile不会在您的服务器上执行代码,所以这里没有问题。 source

搜索“PHP的file_get_contents执行代码”也返回试图执行检索PHP代码,这似乎很奇怪,如果它确实会正常执行任何PHP代码的各种问题。

我还发现one question询问没有执行PHP代码,所以执行似乎也发生在其他人身上。

所以我的问题是:

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

似乎更多的是编程问题而不是安全问题。你检查了php.net手册吗?似乎没有执行我... –

+0

我真的很想看到一个代码示例,其中“that works”... – deceze

回答

7

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

其中可能出现仿佛执行发生的唯一情况是:

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

这些功能是在«函数参考/文件系统相关扩展/文件系统描述的手动的»截面,而执行代码功能在«函数参考/过程控制扩展»说明。

我敢肯定,误解来自于文件系统和网络之间普遍存在的混淆,而PHP流功能使得协议包装可以使用相同的功能来透明地打开任何类型的资源:本地文件,网络资源,压缩归档等在这里我看到无尽的帖里有人做这样的事情:

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

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