如果不是来自某些引用PHP,则限制访问

时间:2012-06-13 19:49:01

标签: php restrict referer

我正在绞尽脑力地解释为什么这不起作用。

我想要达到的目的是限制访问我自己网站上的页面,只有来自某个网​​站,例如Facebook。

由于链接将在一个或多个Facebook页面和/或我的个人资料中发布,因此如果来自Facebook和/或其发布的任何其他“PAGES”,则希望脚本执行。

例如,如果我在 www.facebook.com/This_is_my_PAGE 上发布我的链接,或者发布在我的个人资料中 www.facebook.com/freds_personal_profile 或某人分享我在Facebook上的链接,希望该页面只能访问来自Facebook域的人。

我在搜索解决方案时找到了以下脚本,但它回显了我的错误消息,而不是重定向到相关链接。

$target_site = 'https://www.facebook.com/';
if (isset($_SERVER['HTTP_REFERER']) && preg_match("/$target_site/",$_SERVER['HTTP_REFERER'])) {
// do something with people from facebook.com
} 

else {
// do something else with everyone else

echo "Sorry, viewable to Facebook fans only.";

}

2 个答案:

答案 0 :(得分:5)

首先,您的代码存在缺陷,因为:

  • 如果用户没有使用Facebook的“安全版”(http而不是https)怎么办?
  • 如果用户来自facebook.com而非www.facebook.com
  • ,该怎么办?
  • 如果恶意用户诱使用户来自http://example.com/evilpage.php?https://www.facebook.com/
  • 等网站,该怎么办?

它不起作用的主要原因是因为你的正则表达式完全无效。相反,它应该是:

preg_match("/".preg_quote($target_site,"/")."/i",$_SERVER['HTTP_REFERER']);

documentation on preg_quote()

除此之外,检查引荐来源没有任何安全性。它可以改变,它可以完全阻止。不应该依赖它。

答案 1 :(得分:1)

Facebook挂钩了http协议的外部链接,而不是https。将您的目标网站更改为:

$target_site = 'http://www.facebook.com/';

您可以通过右键单击在facebook中发布的链接并将其复制到剪贴板(然后粘贴)来确认。你会看到它看起来像这样:

`http://www.facebook.com/l.php?u=...`

无论您是否实际使用httpshttp进行浏览,都属于这种情况。