我正在绞尽脑力地解释为什么这不起作用。
我想要达到的目的是限制访问我自己网站上的页面,只有来自某个网站,例如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.";
}
答案 0 :(得分:5)
首先,您的代码存在缺陷,因为:
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=...`
无论您是否实际使用https
或http
进行浏览,都属于这种情况。