3

我正在绞尽脑汁想为什么这不起作用。

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

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

例如,如果我在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.";

}
4

2 回答 2

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']);

关于文档preg_quote()

除此之外,检查推荐人没有安全性。它可以更改,可以完全阻止。它不应该被依赖。

于 2012-06-13T19:54:08.827 回答
1

Facebook 将外部链接连接到http协议,而不是https. 将您的目标站点更改为:

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

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

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

无论您实际上是使用https或浏览,情况都是如此http

于 2012-06-13T19:53:14.643 回答