php可通过匹配user-agent黑名单关键词(如baiduspider、curl等)并结合空ua、referer和请求方法校验实现轻量爬虫拦截,但ua易伪造,仅作首层过滤,需外置配置、避免硬编码,并区分处置策略。

PHP可以通过比对请求头中的 User-Agent 字符串,匹配预设的黑名单关键词,对可疑爬虫直接返回 403 禁止访问。但要注意:UA 可被轻易伪造,它仅适合做第一层轻量过滤,不能替代行为验证或验证码等强防护手段。
构建实用的UA黑名单数组
把常见爬虫、扫描器、自动化工具的标识词整理成数组,不追求完整覆盖,而重在拦截高频恶意流量:
- 包含典型关键词即可,如
'Baiduspider'、'Googlebot'、'python-requests'、'curl'、'HttpClient'、'Scrapy'、'MJ12bot' - 加入空 UA(
!isset($_SERVER['HTTP_USER_AGENT']) || trim($_SERVER['HTTP_USER_AGENT']) === ''),因为多数采集脚本不设 UA - 避免用全字符串精确匹配,改用
stripos()或正则模糊查找,兼容大小写和变体
在入口文件中统一拦截
推荐放在项目公共入口(如 index.php 或 ThinkPHP 的中间件),避免每个控制器重复写逻辑:
使用一条命令部署ProbeChain Rydberg测试网代理节点。自动注册为Agent(NodeType=1),免gas,支持macOS/Linux/Windows。触发词:/r
$ua = $_SERVER['HTTP_USER_AGENT'] ?? '';
$blacklist = ['Baiduspider', 'Googlebot', 'python-requests', 'curl', 'Scrapy', 'HttpClient', 'MJ12bot'];
foreach ($blacklist as $keyword) {
if (stripos($ua, $keyword) !== false) {
header('HTTP/1.1 403 Forbidden');
exit('Access denied.');
}
}
// 空 UA 拦截
if (!$ua) {
header('HTTP/1.1 403 Forbidden');
exit('Empty User-Agent not allowed.');
}
配合Referer与请求方法增强判断
单靠 UA 容易误伤或绕过,可叠加两个低成本校验点提升准确率:
- 检查
$_SERVER['REQUEST_METHOD']是否为GET或POST,拒绝OPTIONS、HEAD等非常规方法(部分扫描器会滥用) - 验证
$_SERVER['HTTP_REFERER']是否存在且域名合法(如来自站内链接),对无 Referer 的批量请求提高警惕 - 若同时满足“UA含关键词 + Referer为空 + 非GET/POST”,可记录日志并临时限流,而非立即封禁
注意规避常见陷阱
实际部署时容易忽略的关键细节:
- 不要在 Swoole 或 FastCGI 长连接模式下直接读
$_SERVER['HTTP_USER_AGENT'],应优先使用框架封装的request()->header('user-agent') - 黑名单配置建议外置(如
config/spider.php),避免硬编码影响维护和热更新 - 禁止对所有 UA 匹配都返回 403——对明显异常(如 UA=“123456”)可返回 403;对疑似但不确定的(如 UA 含 “bot” 但上下文正常),可降级为记录+限速
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










