php - 如果不是来自某些 referer(s) PHP,则限制访问

标签 php restrict referer

我绞尽脑汁想知道为什么这不起作用。

我想要实现的是限制对我自己网站上页面的访问,仅当来自某个网​​站(例如 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.";

}

最佳答案

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

  • 如果用户没有使用 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() )

除此之外,检查引荐来源网址并不安全。它可以改变,也可以完全封锁。不应依赖它。

关于php - 如果不是来自某些 referer(s) PHP,则限制访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11022275/

相关文章:

c++ - 涉及 restrict 关键字的编译器错误

c - tmpfile_s 中限制的目的是什么?

php - 如何在 Zend Framework 中获取 HTTP_REFERER

web-services - 请求 header 中的起源邪恶.示例

php - UTF8 mysql 数据在单个 MySQL 字段中出现不正确

php - 可以将 "Multiple MySQL Queries with PHP"与 MySQL 版本 4 一起使用

PHP - 阅读 POST 变量的好习惯

php - Jquery javascript ajax - 总价格未更新

android - 当 Google Play 控制台设备目录中未显示特定设备品牌/型号时,如何排除它?

ruby-on-rails - 带有 anchor 的 request.referer