用于发布和使用REST的php file_get_contents

时间:2014-06-09 15:10:45

标签: php web-services rest

在我为最近一次采访提供的示例代码中,我使用了file_get_contents来使用他们的Web服务(没有什么特别的,为POST请求发送一些自定义标头)。我发现其他方法如卷曲不必要地复杂和冗长,并且使用file_get_contents来处理我用PHP做的大多数“客户端”事情。

一位采访者认为,除了获取请求之外,不建议使用file_get_contents。我没有当场反对,但回去搜索了一下。他对这个“众所周知的事实”的断言找不到任何可靠的答案

有人指出在此上下文中使用file_get_contents有些缺点吗?也有人能指出我们消除file_get_contents作为一种良好做法的资源吗?

感谢。

3 个答案:

答案 0 :(得分:6)

从安全角度来看,使用file_get_contents()通常不是一个好主意。

了allow_url_fopen

要使file_get_contents()能够使用远程信号源,必须启用设置allow_url_fopen。但是在启用此设置时,PHP中的所有其他流相关功能(如includerequire)也可以使用远程源。这可能会导致Remote File Execution等攻击。

使用其他工具(如cURL)时,您可以停用allow_url_fopen(默认情况下已启用)。

SSL / TLS

默认情况下,PHP流对SSL / TLS不安全。幸运的是,这可以纠正,但在安全使用HTTPS / FTPS源之前确实需要注意。

剩下的问题是PHP无法匹配证书中的主题备用名称(许多证书使用)。这意味着(当安全配置时)PHP可以拒绝有效的证书。为了避免这种情况,您需要停用CN匹配,这样可以打开Man In The Middle attacks

另一方面,

cURL在默认情况下是完全安全的,并且支持SAN匹配。

生存深层:PHP安全

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有很多设置:

  • 指定超时请求的能力
  • 选择GET或POST的能力
  • 传递Cookie的能力
  • 使用BASIC AUTH的能力

对于所有这些以及其他此类事情很难使用file_get_contents。使用curl并不是那么困难,我建议写一个包装类。