file_get_contents和readfile是否执行PHP代码?

tim*_*tim 6 php security

我始终确信PHP可以在任何文件中执行file_get_contentsreadfile执行任何PHP代码 - 无论文件类型如何 - 都是给它的.我在多个设置上试过这个,它总能奏效.

在这里收到了一个关于此的问题,用户似乎认为情况并非如此.

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

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

readfile不会执行服务器上的代码,因此没有问题.资源

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

我还发现了一个询问不执行PHP代码的问题,因此执行似乎也会发生在其他人身上.

所以我的问题是:

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

dec*_*eze 10

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

可能看起来像执行正在发生的唯一情况是:

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


Álv*_*lez 7

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

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

file_get_contents('http://example.com/inc/database.inc.php');
Run Code Online (Sandbox Code Playgroud)

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