首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查PHP referrer

检查PHP referrer
EN

Stack Overflow用户
提问于 2011-02-18 02:17:47
回答 5查看 33.2K关注 0票数 7

因此,我需要使用php检查页面的引用,如果是*.example.com或*.anothersite.com,则执行代码,如果不是,则重定向到其他地方。

如何使用通配符检查HTTP_REFERER是否等于这些值?

谢谢!

编辑: url将包含多个域,因此regex需要匹配找到的第一个匹配项。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-07-22 19:55:57

其他答案“检查”是好的,但并不严格限制在你的网站上。例如,值为http://attacker.com/www.example.com/的referer将通过几乎所有的检查。制作这样的站点并只发送跨域请求是非常容易的。

有一个可靠和安全的方法来检查referer是否是真的你的域。当然,referer可以被欺骗,但攻击者网站的受害者会发送正确的referer。

诀窍在于使用^特殊字符。下面是这个神奇的正则表达式:

代码语言:javascript
复制
^https?://(([a-z0-9-]+)\.)*example\.com/

^ -确保我们处于开始阶段

https? -协议- http或https

(([a-z0-9-]+)\.)* -匹配子域,也是更高级别的子域

example\.com -匹配主域

/ -确保路径的开头,使域名无法继续

票数 6
EN

Stack Overflow用户

发布于 2011-02-18 02:49:23

应该这样做:

代码语言:javascript
复制
$allowed_host = 'example.com';
$host = parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST);

if(substr($host, 0 - strlen($allowed_host)) == $allowed_host) {
  // some code
} else {
  // redirection
}
票数 30
EN

Stack Overflow用户

发布于 2011-02-18 02:22:28

代码语言:javascript
复制
$ref = $_SERVER['HTTP_REFERER'];
if (strpos($ref, 'example.com') !== FALSE) {
   redirect to wherever example.com people should go
}
if (strpos($ref, 'example.org') !== FALSE) {
    redirect to wherever example.org people should go
}

当然,这只有在推荐人“很好”的情况下才能起作用。例如,如果你来自谷歌,你可能会在某处搜索到"example.org“,这种情况下,即使你来自谷歌,strpos也会看到它,并进行重定向。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5032889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档