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

时间:2011-09-13 16:09:17

标签: php file-get-contents referrer

我的网站上托管了一个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)来调用外部脚本,有人可以建议正确的或者这应该有效吗?

任何帮助非常感谢。 感谢

4 个答案:

答案 0 :(得分:5)

请记住,HTTP“Referer”标题是一个可选标题 - 不需要网站将其发送给您,并且可以轻松伪造。如果您真的只想让某些人使用您的资源,那么最好使用某种形式的身份验证。

通常Referer:由Web浏览器发送,但不需要它 - 例如,如果引用者是安全站点,他们将不会发送它。使用PHP file_get_contents()无论如何技术上都没有引用;你不是从任何地方被“引用”的。

请考虑:

  • 按IP地址锁定(但请记住,多个域可以共享一个IP,并且域的IP可以更改。)
  • 使用某种形式的身份验证(最好以纯文本形式传输密码!)

您应该考虑在确定要应用的正确安全性时,您需要此服务的安全性以及可能会攻击它的威胁。

答案 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

此外,如果需要,您可以设置“秘密”标头来验证请求,而不是参考者。