php用session防爬核心是组合频控、一次性token与会话状态识别:基于ip+session id限流,2秒内拒收、15分钟超5次返回429;表单token一次有效并即时销毁;通过session空置、cookie不一致识别基础爬虫;须启用httponly/secure、禁用url传id、定期重生成id保障session安全。

PHP 使用 Session 防止爬虫重复请求,核心不是“靠 Session 拦住所有爬虫”,而是通过会话状态建立轻量级人机行为边界——让真实用户自然延续会话,而多数无状态、不维护 Cookie 的爬虫难以持续伪造。关键在于组合使用 Session + 时间窗口 + 行为特征,而非单独依赖 session 存在与否。
用 Session 记录请求频次与时间戳
对敏感接口(如留言、登录、询盘),以 IP + Session ID 为联合维度做短时频控:
- 每次请求前读取 $_SESSION['last_submit_time'] 和 $_SESSION['submit_count_15m']
- 若距上次请求不足 2 秒,直接拒绝(防脚本秒刷)
- 若 15 分钟内提交超 5 次,返回 HTTP 429 并提示“操作频繁”,不记录错误日志(避免暴露防御逻辑)
- 每次合法请求后更新时间戳并累加计数,超时自动失效(无需手动清理)
绑定一次性 Token 防重放与 CSRF
Session 是 Token 的安全载体,但 Token 本身必须“一次有效”:
- 页面渲染时生成唯一 token:bin2hex(random_bytes(16)),存入 $_SESSION['form_token'],同时输出到表单 hidden 字段
- 提交时严格比对 $_POST['token'] 与 $_SESSION['form_token'],匹配则立即 unset($_SESSION['form_token'])
- 若 token 为空、不匹配或已销毁,一律拒收,不执行业务逻辑
- 该机制天然阻断爬虫重放同一请求,也防止第三方页面伪造提交
结合会话存活状态识别基础爬虫行为
很多通用爬虫(如 Baiduspider、YisouSpider)不带 Cookie,也不维持会话上下文:
- 检查 $_SESSION 是否已启动且非空(session_status() === PHP_SESSION_ACTIVE)
- 对比 $_COOKIE 与 $_SESSION 中的标识是否一致(如存在 thinkphp_token 或自定义 session_id 字段)
- 若请求携带了 session_id 但 $_SESSION 数据为空,大概率是伪造 Cookie 的扫描行为
- 可对此类请求降权:延迟响应、增加 JS 挑战、或仅限流不限制(避免误伤搜索引擎)
注意 Session 本身的防护前提
Session 防护有效,前提是 Session 本身不被绕过或劫持:
- 启用 session.cookie_httponly = 1 和 session.cookie_secure = 1(HTTPS 环境)
- 避免将 session_id 暴露在 URL 中(session.use_trans_sid = 0)
- 敏感操作前重新生成 session_id:session_regenerate_id(true)
- 设置合理 session 生命周期(如 session.gc_maxlifetime = 1800),避免长期会话被复用
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











