我的网站上托管了一个PHP脚本,它根据传递的GET参数输出一个值。
其他网站通过PHP函数file_get_contents使用url和get params从他们自己的PHP脚本中调用此脚本,并且只返回所请求的值。
我试图只允许某些域访问此脚本,并且一直使用HTTP_REFERER来检查谁在调用脚本。
if (isset($_SERVER['HTTP_REFERER'])) // check if referrer is set
{
echo $_SERVER['HTTP_REFERER']; // echo referrer
}
else
{
echo 'No referrer set'; // echo failure message
}
当我使用file_get_contents时,我收到了无参与者设置,但如果我使用从页面到具有上述代码的脚本的点击链接,则引荐来源正确显示。
我是否使用了错误的函数(file_get_contents)来调用外部脚本,有人可以建议正确的或者这应该有效吗?
任何帮助非常感谢。 感谢
答案 0 :(得分:5)
请记住,HTTP“Referer”标题是一个可选标题 - 不需要网站将其发送给您,并且可以轻松伪造。如果您真的只想让某些人使用您的资源,那么最好使用某种形式的身份验证。
通常Referer:由Web浏览器发送,但不需要它 - 例如,如果引用者是安全站点,他们将不会发送它。使用PHP file_get_contents()
无论如何技术上都没有引用;你不是从任何地方被“引用”的。
请考虑:
您应该考虑在确定要应用的正确安全性时,您需要此服务的安全性以及可能会攻击它的威胁。
答案 1 :(得分:4)
基于IP地址而不是域限制会更好,更可靠。只需保留一组允许的IP,然后调用in_array($_SERVER['REMOTE_ADDR'],$allowedAddresses)
进行验证。
或者只是要求通过cookie或HTTP身份验证进行身份验证...
答案 2 :(得分:1)
您无法使用HTTP_REFERER执行此操作。
客户端设置的HTTP_REFERER,它可以是客户端想要的任何内容。
您必须使用密码/密钥身份验证机制。
答案 3 :(得分:0)
可能希望使用流上下文的内容来设置额外的标题。
http://us.php.net/manual/en/function.stream-context-create.php
此外,如果需要,您可以设置“秘密”标头来验证请求,而不是参考者。