PHP通过file_get_contents获取调用脚本的站点


PHP get the site that calls your script via file_get_contents

我的站点上有一个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'头来验证请求,而不是引用者。