能否通过HTTP_REFERER检测机器人?能否利用该变量识别盗站网站?
关于HTTP_REFERER检测机器人与盗站的问题解答
1. 能否通过HTTP_REFERER检测机器人?
完全不行,靠HTTP_REFERER来识别机器人是个很不靠谱的思路,原因有这几点:
- 很多合法爬虫(比如谷歌、百度的搜索引擎爬虫)本身就不会发送
HTTP_REFERER请求头; - 恶意机器人或者盗站脚本可以轻松伪造任意
HTTP_REFERER值,想伪装成正常用户跳转来的简直易如反掌; - 不少真实用户的浏览器也会因为隐私设置、代理工具或者跨域场景,不发送这个请求头。
用这个方法区分机器人和真实用户,误判率高到几乎没实用价值。
2. 能否通过检查HTTP_REFERER变量识别盗站行为?
这个方法只能起到最基础的威慑作用,根本挡不住有经验的盗站者,而且你的示例代码逻辑还存在问题:
你的代码是只要存在HTTP_REFERER就拦截,这会把所有从其他网站跳转来的正常用户都挡在外面——比如从社交媒体、搜索引擎点进来的用户,这显然和你保护内容的初衷背道而驰。
先给你修正一下逻辑:应该检查HTTP_REFERER是否来自非信任的域名,而非只要有referer就拦截,示例代码如下:
// 填写你自己的网站域名(包括www前缀的版本) $trustedDomains = ['yourdomain.com', 'www.yourdomain.com']; $accessAllowed = true; if (isset($_SERVER['HTTP_REFERER'])) { // 解析出referer的主机域名 $refererHost = parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST); // 检查该域名是否在信任列表内 if (!in_array($refererHost, $trustedDomains)) { $accessAllowed = false; } } if (!$accessAllowed) { die('Access blocked'); } else { // 正常处理页面请求 }
但就算修正了逻辑,这个方案依然有很大局限:HTTP_REFERER是可以被随意伪造的,盗站者只要把referer设成你的域名,就能轻松绕过检测。
如果真的想有效防护盗站,建议结合这些手段:
- 给页面核心内容添加水印(虽然能被去除,但能增加盗站的时间成本);
- 限制单IP的请求频率,防止对方批量爬取你的内容;
- 对关键文本内容做轻度混淆处理;
- 使用服务器层面的防盗链配置(比如Nginx的
valid_referers指令),比纯PHP检测的可靠性稍高一些,但同样无法完全避免被绕过。
内容的提问来源于stack exchange,提问作者Wojciech Urbaniak
相关产品推荐
相关产品推荐

