我的站点上有一个PHP脚本,它根据传递的GET参数输出一个值。
其他站点通过PHP函数file_get_contents(带有url和get参数)在自己的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时,我没有获得referrer设置,但如果我使用从页面到具有上述代码的脚本的单击链接,则referrer正确显示。
我是否使用了错误的函数(file_get_contents)来调用外部脚本,有人可以建议正确的还是应该这样做?
非常感谢任何帮助。由于
请记住,HTTP "Referer"标头是一个可选的标头——网站不需要将其发送给您,而且很容易伪造。如果你真的只希望某些人使用你的资源,你最好使用某种形式的身份验证。
通常Referer:是由web浏览器发送的,但没有必要——例如,如果Referer是一个安全的站点,他们就不会发送它。对于PHP file_get_contents()
,无论如何都没有技术上的引用;你不是从任何地方被"推荐"过来的。
可以考虑:
- 按IP地址锁定(但请记住,多个域可以共享单个IP,并且一个域的IP可以更改)
- 使用某种形式的身份验证(最好是而不是以明文传输密码的)
在决定应用正确的安全措施时,您应该考虑您需要此服务的安全程度,以及可能攻击它的威胁。
基于IP地址而不是域名进行限制会更好,更可靠。只需保留一个允许的IP数组,并调用in_array($_SERVER['REMOTE_ADDR'],$allowedAddresses)
来验证它。
不能使用HTTP_REFERER。
HTTP_REFERER由客户端设置,它可以是客户端想要的任何值。
您必须使用密码/密钥认证机制。
可以使用流上下文中的一些内容来设置额外的头。
http://us.php.net/manual/en/function.stream-context-create.php此外,如果需要,您可以设置一个'secret'头来验证请求,而不是引用者。