PHP可通过$_SERVER['HTTP_REFERER']校验请求来源,仅作辅助手段;提取Referer域名并与白名单比对,不匹配则拒绝访问,但易误判合法用户且可被伪造,故不适用于敏感操作。

PHP可以通过检查 $_SERVER['HTTP_REFERER'] 的值,对请求来源做简单校验,从而拦截部分不带 Referer 或伪造 Referer 的爬虫。但需注意:Referer 可被轻易伪造或不发送,因此它仅适合做辅助校验,不能作为安全防护的核心手段。
基础 Referer 校验逻辑
判断请求是否来自允许的域名(如本站页面),非白名单来源则拒绝访问:
- 获取 Referer 值:
$referer = $_SERVER['HTTP_REFERER'] ?? ''; - 提取来源域名:
$host = parse_url($referer, PHP_URL_HOST); - 比对白名单(如
['example.com', 'www.example.com']),不匹配则终止脚本:exit('Access denied');
常见误判与规避问题
直接匹配 Referer 容易误伤合法用户:
- 用户从书签、HTTPS 页面跳转到 HTTP 页面时,浏览器可能不发 Referer
- 隐私模式、某些浏览器插件或移动端 WebView 可能屏蔽或清空 Referer
- 用户手动输入 URL 访问,Referer 为空
- 爬虫可伪造 Referer(如 cURL 设置
-H "Referer: https://example.com")
建议:仅对非关键接口(如分页链接、列表加载)启用 Referer 校验,登录、支付等敏感操作不应依赖它。
立即学习“PHP免费学习笔记(深入)”;
配合其他字段提升有效性
单独用 Referer 效果有限,可叠加简单组合策略提高识别门槛:
- 检查 User-Agent 是否为空或含明显爬虫关键词(如
python-requests、curl、bot) - 验证请求头中是否存在
Accept、Accept-Language等典型浏览器字段 - 对无 Referer 请求,增加 JS 挑战(如页面加载后通过 AJAX 补发带签名的 token)
- 记录高频无 Referer 的 IP,结合频率限制(如 1 分钟内超 10 次即限流)
示例代码(轻量级校验)
以下为一个简化的中间校验片段,适用于入口脚本或公共 include 文件:
$allowed_hosts = ['example.com', 'www.example.com'];
$referer = $_SERVER['HTTP_REFERER'] ?? '';
$host = parse_url($referer, PHP_URL_HOST);
if (!$referer || !in_array($host, $allowed_hosts)) {
// 可选:记录日志或返回 403
http_response_code(403);
exit('Forbidden');
}



















