核心是让自动化提交低效高成本,需服务端多层协同:①Session令牌校验并销毁;②IP+Session频次限制(如15分钟3次);③JS挑战、时间阈值、隐藏字段陷阱等轻量人机验证;④Referer与UA初筛、输入过滤、PRG防重提、预处理SQL兜底。

PHP网站防爬虫恶意提交表单,核心不是“堵死所有请求”,而是让自动化提交变得低效、高成本、易识别。重点在于服务端多层协同过滤,兼顾安全与用户体验,避免过度依赖前端或单一手段。
服务端行为识别 + 会话绑定
单纯靠IP限频容易误伤(如企业出口NAT),仅靠User-Agent又极易伪造。推荐组合使用:
- 用
$_SESSION生成唯一表单令牌(token),每次页面加载时调用bin2hex(random_bytes(16))生成,并存入session;提交时比对,验证后立即销毁该token - 记录
IP + Session ID维度的提交频次(例如:15分钟内最多3次),缓存建议用Redis,避免数据库写压力 - 对同一IP高频触发但Session为空的请求,可临时增加JS挑战(如计算哈希、设置特定cookie),无执行环境的爬虫直接失败
轻量人机验证不伤转化率
企业官网不宜强推图形验证码,可用更隐蔽、用户无感的方式提升机器识别门槛:
- 时间阈值检测:前端用JS记录页面加载到提交的耗时,若<1.5秒,大概率是脚本提交,后端可拒绝或升级验证
-
隐藏字段陷阱(Honeypot):添加CSS隐藏的
<input type="text" name="email_hidden" style="display:none">,正常用户不会填,爬虫常自动填充;提交时若该字段非空,直接返回403且不记录日志 - 二次确认跳转:对询盘、批量留言等高风险操作,先收基础信息,服务端生成带签名的临时token,再跳转至确认页完成最终提交,增加自动化难度
基础请求筛查与数据净化
这是第一道过滤网,虽不能防高级爬虫,但能筛掉大量低级扫描器:
立即学习“PHP免费学习笔记(深入)”;
- 检查
$_SERVER['HTTP_REFERER']是否来自本站域名(注意:仅作初筛,不可作为唯一依据) - 过滤明显异常UA,如包含
Baiduspider、YisouSpider、Empty UA或已知恶意爬虫特征串,匹配即返回403 - 所有接收字段立即
trim()去空格,敏感字段(邮箱、电话)用filter_var()校验格式,输出到页面前必过htmlspecialchars()
防重提 + 防注入兜底处理
即使绕过前面几层,也要确保数据落地前不出问题:
- 关键操作(如注册、留言)启用Post/Redirect/Get(PRG)模式,防止刷新重复提交
- SQL操作一律使用PDO预处理或MySQLi参数化查询,禁用拼接SQL
- 对富文本类输入,严格白名单过滤HTML标签,非必要不开启
allow_url_fopen等危险配置



















