使用变量位置的file_get_contents()的安全漏洞

kmo*_*y12 2 php security verification

我网站的部分申请流程是用户必须证明网站的所有权.我迅速将一些代码汇总到一起,但直到现在还没有意识到它可能存在一些漏洞.

像这样的东西:

$generatedCode="9s8dfOJDFOIesdsa";
$url="http://anyDomainGivenByUser.com/verification.txt";

if(file_get_contents($url)==$generatedCode){
//verification complete!
}
Run Code Online (Sandbox Code Playgroud)

为file_get_contents()提供用户提供的URL是否有任何威胁?

编辑:上面的代码只是一个例子.generatedCode显然有点复杂,但仍然只是一个字符串.

Sil*_*Fox 6

是的,这可能是服务器端请求伪造漏洞 - 如果$url是动态的,您应该验证它是外部 Internet地址,并且该方案指定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也可用于检索本地文件,但如果您验证它是一个有效的面向HTTP的URL,如上所述,如果您决定向用户显示verification.txt不匹配时包含的内容,则此措施应该阻止读取本地文件.此外,如果要显示verification.txt站点上任何位置的内容,则应确保输出已正确编码以防止XSS.