2012-06-13 28 views
3

我正在绞尽脑汁,为什么这是行不通的。限制访问如果不是来自某些引用者PHP

我想实现的目标是限制访问我自己的网站上的页面,只有来自某个网​​站,例如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."; 

} 
+2

也许你应该在错误信息中回显'$ _SERVER ['HTTP_REFERER']'的内容。这会给你一个提示。 – jasonlfunk

+0

HTTP_REFEER不是强制性标题,它可能不会被浏览器设置。 – Zefiryn

回答

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()

从所有这一切

除此之外,还有在检查引荐没有安全。它可以被改变,它可以被完全阻止。它不应该依赖。

+0

我从另外一个类似的问题上拿出了这个问题,认为它会持有水。这是一个公认的答案。 –

+2

被接受的答案意味着提问的人发现它是正确的。这并不意味着它是最好的答案,也不意味着它是完全正确的,只是它在提问者看来帮助最大。 –

+0

True Kolink。如果下次有,我会更加警惕。 –

1

Facebook的挂接外部链接到http协议,不https。改变你的目标网站,这一点:

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

您可以通过右键单击张贴在Facebook上的链接,并将其复制到剪贴板(然后将其粘贴)证实了这一点。你会看到它看起来像这样:

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

无论你是实际上httpshttp浏览就属于这种情况。

+0

我尝试了Ben感谢,即使使用http和https,它仍然显示我的错误消息。这是我没有得到的。 –

+0

弗雷德,我也注意到你的正则表达式完全被破坏了。请参阅@ Kilink的答案。 –

+0

我正在处理他的代码,出于某种原因得到500错误。 –

相关问题