在我为最近一次采访提供的示例代码中,我使用了file_get_contents来使用他们的Web服务(没有什么特别的,为POST请求发送一些自定义标头)。我发现其他方法如卷曲不必要地复杂和冗长,并且使用file_get_contents来处理我用PHP做的大多数“客户端”事情。
一位采访者认为,除了获取请求之外,不建议使用file_get_contents。我没有当场反对,但回去搜索了一下。他对这个“众所周知的事实”的断言找不到任何可靠的答案
有人指出在此上下文中使用file_get_contents有些缺点吗?也有人能指出我们消除file_get_contents作为一种良好做法的资源吗?
感谢。
答案 0 :(得分:6)
从安全角度来看,使用file_get_contents()
通常不是一个好主意。
要使file_get_contents()
能够使用远程信号源,必须启用设置allow_url_fopen
。但是在启用此设置时,PHP中的所有其他流相关功能(如include
和require
)也可以使用远程源。这可能会导致Remote File Execution等攻击。
使用其他工具(如cURL)时,您可以停用allow_url_fopen
(默认情况下已启用)。
默认情况下,PHP流对SSL / TLS不安全。幸运的是,这可以纠正,但在安全使用HTTPS / FTPS源之前确实需要注意。
剩下的问题是PHP无法匹配证书中的主题备用名称(许多证书使用)。这意味着(当安全配置时)PHP可以拒绝有效的证书。为了避免这种情况,您需要停用CN匹配,这样可以打开Man In The Middle attacks。
另一方面,cURL在默认情况下是完全安全的,并且支持SAN匹配。
PádraicBrady正在写一本关于PHP安全的书,其中有this chapter你可能想要阅读。
您可能需要查看Guzzle:
Guzzle是一个PHP HTTP客户端,可以轻松使用HTTP / 1.1并消除使用Web服务的痛苦。它默认使用cURL。
答案 1 :(得分:1)
通过传递stream_context,您可以将file_get_contents()
用于简单的GET请求。但随后它会很快变得像cURL或其他人一样复杂,而(IMHO)则不那么直观。
正如Jasper所指出的那样,file_get_contents()
需要allow_url_fopen=1
,这也可能是一种安全威胁。但是,无论如何,allow_url_fopen在大多数主机上都是活动的,我个人认为PHP中存在更糟糕的安全隐患。
我的结论是:如果您只为自己构建应用程序,请使用file_get_contents()
或cURL。如果您需要可移植性,请使用其中一个在原始套接字上实现HTTP客户端的库,例如Snoopy。
答案 2 :(得分:0)
最适合这种用途卷曲。 Curl有很多设置:
对于所有这些以及其他此类事情很难使用file_get_contents。使用curl并不是那么困难,我建议写一个包装类。