是的,这可能是一个服务器端请求伪造漏洞——如果$url
是动态的,您应该验证它是一个外部互联网地址,并且该方案指定了 HTTP 或 HTTPS 协议。理想情况下,您只使用 HTTPS 协议,然后验证证书以防止任何DNS 劫持的可能性。
如果$url
是用户可控的,他们可以替换内部 IP 地址并使用您的应用程序作为代理来探测防火墙后面的网络。例如,如果他们将主机设置$url
为192.168.123.1
,您的脚本将请求http://192.168.123.1/verification.txt
并且由于有效和无效内部地址之间的响应时间不同,他们可能能够确定另一台机器处于托管环境中。这称为定时攻击。这可能是您可能不一定希望公开的服务器。当然,这不太可能单独攻击您的网络,但它是信息泄漏的一种形式,可能会帮助攻击者枚举您的网络,为另一次攻击做好准备。
您需要在每次请求时验证 URL 或解析的 DNS,否则攻击者可以将其设置为外部以通过验证,然后立即将其重新指向内部地址以开始探测。
file_get_contents本身看起来是安全的,因为它检索 URL 并将其放入字符串中。只要您不在任何脚本引擎中处理字符串或使用 is 作为任何执行参数,您就应该是安全的。file_get_contents
也可用于检索本地文件,但如果您验证它是一个有效的面向 Internet 的 HTTP URL,如上所述,如果您决定向用户显示verification.txt
不匹配的内容,则此措施应防止读取本地文件。此外,如果您要verification.txt
在网站上显示任何地方的内容,则应确保正确编码输出以防止 XSS。