在PHP中,allow_url_fopen
标志控制是否可以使用used by various file system functions来访问远程文件。
由于当前安全最佳实践建议将其禁用,因此建议禁用此选项。但是,如果禁用此设置,则依赖此功能才能工作的任何代码都将被破坏。例如,我知道至少有一个reCaptcha插件,该插件使用file_get_contents()
访问Google API,因此依赖于此标志。
为了检查我们应用程序中的代码以确定禁用此标志是否安全(为了在必要时进行重写),我需要受其影响的PHP函数的规范列表。但是,我一直找不到这样的列表-PHP网站上似乎没有一个列表,而Google搜索也没有找到任何列表。
allow_url_fopen
影响的所有PHP函数的列表吗?被接受的答案应参考权威消息来源或提供有关用于编制列表的方法的详细信息,以证明其正确性和完整性。
答案 0 :(得分:3)
函数列表非常庞大,因为allow_url_fopen
ini指令是在PHP的流系统中实现的,这意味着使用PHP网络流的任何内容都会受到影响。
这几乎包括PHP的每个扩展中的功能,这些功能不使用外部库来访问远程文件。由于某些扩展名(例如cURL)在PHP之外使用其自己的传输层。
众所周知,某些扩展名ext/soap
确实以某种方式绕过了该指令(出于什么原因,由于我不熟悉此扩展名的内部原因,我不知道到底是什么原因。)
标准库中的任何函数(在main/
,Zend/
,ext/standard
,ext/spl
中实现),意味着每个文件系统,流,包含和URL包装器均应遵守此要求指示。从我的头顶上,我还知道ext/exif
是这样做的。
我不记得我是否基于XML的扩展名(例如ext/libxml
,ext/simplexml
,ext/xmlreader
,ext/xmlwriter
,ext/dom
)这样做,但是我敢肯定,过去有些时候他们不尊重它,因为该路径是直接提供给下面的LibXML2的。
答案 1 :(得分:1)
当allow_url_fopen 启用时,这需要一个函数/方法列表,这些函数/方法可以采用文件路径或URL。使其成为社区维基,因为我发现这个问题的原因是我正在寻找这样一个列表,但不确定我是否正在考虑所有极端情况。
copy
file
file_get_contents
file_put_contents
fopen
simplexml_load_file
file_exists
filemtime
filesize
filetype
is_dir
is_file
注意:并非所有这些都适用于所有类型的 URL。例如,“https://” URL 不允许写入,因此 copy
和 file_put_contents
在此类目标上将失败。同时,ftp://
URL 允许写入。 file_exists
的类似问题。
我故意不包括 fwrite
和 fclose
之类的函数。因为那些特别需要 fopen
的结果。所以在我看来,受影响的是 fopen
,而不是 fwrite
或 fclose
。因为 fwrite
不能打开文件,所以只有 fopen
可以(在这三个中)。所以需要检查的是 fopen
,而不是 fwrite
或 fclose
的后续使用。如果 fopen
有效,这些方法要么有效,要么失败。
这就是为什么我发现诸如“标准库中的任何函数”之类的答案没有帮助的原因。大多数这些函数都适用于在 allow_url_fopen 下打开的流,但它们本身不会打开这样的流。可能有很多函数和方法会占用原本通过URL打开的资源,但除非他们参与打开,否则我不关心它们。
另一种表述方式是,当启用 allow_url_fopen 时(但不是禁用时),我试图列出所有接受 URL(例如 https://stackoverflow.com/ )作为文件路径的函数。 fwrite
和 fclose
之类的函数不会这样做(它们获取资源,而不是文件路径)。所以即使他们的行为受到allow_url_fopen的影响,我也不关心他们。我意识到最初的问题并没有说清楚,但我相信这是我们的意图。
相关:list of supported protocols and wrappers。
即使关闭了allow_url_fopen,fsockopen
和curl
函数也可以打开网址。