哪些 PHP 函数受 allow_url_fopen 影响?

Posted

技术标签:

【中文标题】哪些 PHP 函数受 allow_url_fopen 影响?【英文标题】:Which PHP functions are affected by allow_url_fopen? 【发布时间】:2019-08-14 05:33:50 【问题描述】:

php 中,allow_url_fopen 标志控制远程 URL 是否可以是 used by various file system functions,以便访问远程文件。

现在建议安全最佳实践禁用此选项,因为它是潜在的攻击媒介。但是,如果禁用该设置,任何依赖此功能才能工作的代码都会被破坏。例如,我知道至少有一个 reCaptcha 插件使用 file_get_contents() 来访问 Google API,因此依赖于这个标志。

为了检查我们应用程序中的代码以确定禁用此标志是否安全(以在必要时进行重写),我需要它影响的 PHP 函数的规范列表。但是,我一直找不到这样的列表 - PHP 网站上似乎没有,而且 Google 搜索也没有找到任何结果。

谁能提供行为受allow_url_fopen影响的所有PHP函数的列表?

接受的答案应引用权威来源或提供有关用于编制列表的方法的详细信息,以证明其正确性和完整性。

【问题讨论】:

您是否检查了使用设置allow_url_fopen 的PHP 源代码并从那里向后退? 这就是后备方法,我猜,如果此信息不存在于其他任何地方,但听起来工作量很大。 【参考方案1】:

函数列表非常庞大,因为allow_url_fopen ini 指令是在 PHP 的流系统中实现的,这意味着任何使用 PHP 网络流的东西都会受到影响。

这包括几乎所有 PHP 扩展中的函数,它们不使用外部库来访问远程文件。因为像 cURL 这样的一些扩展在 PHP 之外使用自己的传输层。

一些扩展,众所周知的 ext/soap 确实在某些方面绕过了这个指令(我不完全知道是什么原因,因为我不熟悉这个扩展的内部结构)。

标准库中的任何函数(实现于:main/Zend/ext/standardext/spl),这意味着每个文件系统、流、包含和 URL 包装器都遵循此指令。我也知道ext/exif 会这样做。

如果基于 XML 的扩展(例如 ext/libxmlext/simplexmlext/xmlreaderext/xmlwriterext/dom)执行此操作,我不记得了,但我确信存在过去他们不尊重它的点,因为路径直接提供给下面的 LibXML2。

【讨论】:

【参考方案2】:

这需要在启用 allow_url_fopen 时可以采用文件路径或 URL 的函数/方法列表。使它成为社区 wiki,因为我发现这个问题的原因是我正在寻找这样的列表,并且不确定我是否正在考虑每一个角落案例。

打开一个文件

copy file file_get_contents file_put_contents fopen simplexml_load_file

统计文件

file_exists filemtime filesize filetype is_dir is_file

注意:并非所有这些都适用于所有类型的 URL。例如,“https://”URL 不允许写入,因此 copyfile_put_contents 在此类目标上将失败。同时,ftp:// URL 确实允许写入。 file_exists 的类似问题。

我故意不包括 fwritefclose 这样的函数。因为那些特别采用fopen 的结果。所以在我看来,受到影响的是fopen,而不是fwrite,也不是fclose。因为fwrite 不能打开文件,只有fopen 可以(这三个)。所以需要检查的是fopen,而不是fwritefclose 的后续使用。如果fopen 这样做,这些将起作用或失败。

这就是为什么我发现像“标准库中的任何函数”这样的答案没有什么帮助。这些函数中的大多数将与在 allow_url_fopen 下打开的流一起使用,但它们本身不会打开这样的流。可能有很多函数和方法会获取原本通过URL打开的资源,但除非他们参与打开,否则我不关心它们。

另一种说法是,当启用 allow_url_fopen 时(但在禁用时),我试图列出所有接受 URL 的函数(例如 https://***.com/ )作为文件路径。像 fwritefclose 这样的函数不会这样做(它们占用资源,而不是文件路径)。所以即使他们的行为受到allow_url_fopen的影响,我也不关心他们。我意识到最初的问题并没有说明这一点,但我相信这就是预期的。

相关:list of supported protocols and wrappers.

fsockopencurl 函数即使在 allow_url_fopen 关闭的情况下也可以打开 URL。

【讨论】:

I realize that the original question does not make this clear, but I believe that this was what was intended. - 是的,这就是目的。如果allow_url_fopen 被禁用,我需要找到行为会改变的函数的所有用途,并且我同意对打开的文件句柄资源进行操作的函数不会受到影响。

以上是关于哪些 PHP 函数受 allow_url_fopen 影响?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能在 PHP 中调用这个受保护的函数?

PHP 用于访问类中所有受保护变量的函数

从 PHP 中的类外部调用受保护的方法

php mysqli 常用函数都有哪些

常见的PHP 安全性攻击有哪些呢 ?

开源PHP组件漏洞曝光,多个运行CMS系统的网站受影响