如何识别并拦截cURL请求?解析竞品反爬虫机制
网站反爬识别手段分析及落地建议
从你给出的响应头差异和场景描述来看,目标网站的反爬核心是在首次请求时校验请求来源的真实性,只有通过校验的请求才会生成有效会话Cookie(如spid/spsc),否则返回空页面。具体的识别手段和可落地的反爬方案如下:
一、目标网站的核心识别逻辑
1. TLS指纹(JA3/JA3S)校验
浏览器和cURL/Postman的TLS握手参数差异极大:
- 浏览器会发送特定的加密套件列表、ALPN扩展、EC点格式等参数,形成唯一的JA3哈希指纹
- cURL默认的TLS配置和浏览器完全不匹配,哪怕你复制了所有请求头,握手阶段的指纹已经暴露了非浏览器身份
- 网站通过对比请求的JA3哈希和预存的浏览器指纹库,不匹配就拒绝生成有效会话
2. 请求元数据的完整性校验
除了可见的请求头,网站还可能检查这些细节:
- 请求头顺序:浏览器发送请求头有固定顺序(比如先
Host再User-Agent),cURL/Postman的头顺序往往不一致 - 隐式请求头:浏览器会自动携带
Sec-Fetch-*系列头(如Sec-Fetch-Site: none)、Accept-Language的标准值,这些你可能没完全复制 - 请求上下文:首次访问时浏览器无Cookie,但网站可能会检查请求中是否有非法Cookie格式,或者结合IP、UA生成临时校验逻辑,cURL环境不满足要求
3. 会话预绑定机制
网站在首次响应前会完成合法性验证:
- 只有通过校验的请求才会下发
spid/spsc这类会话标识 - 后续请求必须携带该标识,且校验标识和请求来源的绑定关系(比如TLS指纹是否和首次请求一致)
- 无有效会话的请求直接返回空页面,阻断爬虫
二、自身网站的反爬落地方案
1. 实现TLS指纹校验
- 收集Chrome、Firefox、Safari等主流浏览器的JA3/JA3S哈希值,存到服务器白名单
- 在Nginx或应用层拦截请求时,计算当前请求的JA3哈希,不在白名单内的直接返回空页面
- 可以用Nginx的开源
ngx_http_ja3_module快速集成,无需大量代码开发
2. 强化请求头校验
- 强制校验请求头的顺序和完整性:要求必须携带
Sec-Fetch-Site、Accept-Language等隐式头,且Accept-Encoding必须包含gzip, br - 拒绝缺失关键头或头格式不符合浏览器规范的请求
3. 会话绑定防护
- 首次请求通过校验后,结合TLS指纹、IP、UA生成唯一会话标识(如
spid),通过set-cookie下发 - 后续所有请求必须携带该会话标识,且校验标识对应的TLS指纹、IP是否和首次请求一致,不一致则拒绝服务
- 对无有效会话的请求返回空页面,避免爬虫绕过校验
4. 动态内容校验
- 在页面中嵌入JS生成的动态token,爬虫如果不执行JS就无法获取该token,后续提交请求会被拒绝
- 服务端渲染页面时,只有通过初始校验的请求才能获取包含有效token的内容
响应头对比参考
浏览器响应头:
HTTP/1.1 200 Server: nginx Date: Tue, 19 Sep 2023 15:42:12 GMT Content-Type: text/html;charset=utf-8 Transfer-Encoding: chunked Connection: keep-alive Keep-Alive: timeout=15 set-cookie: spid=some_spid_value; Path=/; Secure; SameSite=None set-cookie: spsc=some_spsc_value; Path=/; Secure; SameSite=None vary: Accept-Encoding content-encoding: gzip strict-transport-security: max-age=15724800; includeSubDomains X-SP-CRID: 1909462187:1
cURL响应头(复制浏览器请求头):
HTTP/1.1 200 OK Server: nginx Date: Tue, 19 Sep 2023 15:43:28 GMT Transfer-Encoding: chunked Connection: keep-alive Keep-Alive: timeout=15 access-control-allow-origin: * cache-control: no-cache expires: Tue, 19 Sep 2023 15:4327 GMT pragma: no-cache content-type: text/html X-SP-CRID: 1913083470:1
内容的提问来源于stack exchange,提问作者QuestionMan
相关产品推荐
相关产品推荐

