You need to enable JavaScript to run this app. 2021年PHP cURL访问Cloudflare防护网站返回403问题排查
优惠活动
大模型
产品
解决方案
定价
更多

2021年PHP cURL访问Cloudflare防护网站返回403问题排查

目标站点的Cloudflare防护类型

你遇到的是Cloudflare边缘端前置指纹校验拦截规则,属于2021年前后全站铺开的无交互拦截机制,和传统的JS挑战、人机验证码流程完全不同。
这套规则不需要向客户端下发任何校验内容,会在TLS握手阶段就提取客户端的TLS特征(对应行业通用的JA3/JA4指纹识别逻辑)、HTTP2帧发送特征、请求头排列特征,只要匹配内置的非浏览器客户端黑名单,就直接在连接建立后第一时间返回403响应,整个过程不会触发后续的JS校验、验证码页面流程。
你抓取的响应头里的cf-chl-bypass: 1字段就是直接证据:这个标识代表Cloudflare主动跳过了所有后续校验流程,直接因为前置规则命中做的拦截。这也解释了为什么你还没等到任何JS内容加载就被403——拦截动作根本发生在HTTP响应内容下发之前。

现有操作全部无法绕过拦截的原因

  • 原生cURL/PHP cURL扩展的TLS指纹是固定值,已经被Cloudflare纳入拦截名单:不管你修改什么User-Agent、添加多少和Chrome一致的HTTP请求头,只要握手阶段的TLS密码套件顺序、扩展列表、ALPN协商特征和真实Chrome不一致,就会被直接拦截。这部分特征是cURL程序本身决定的,靠修改HTTP层参数完全改不了。
  • 从Chrome开发者工具导出的curl命令本质是参数集合,不是客户端本身:导出的命令执行时还是依赖你本地安装的cURL程序,TLS指纹没有任何变化,自然还是会被拦截。
  • 你提供的PHP代码存在逻辑错误:代码中中途把之前设置的Chrome User-Agent覆盖成了facebookexternalhit/1.1,这个标识属于Cloudflare重点监控的爬虫类UA,本身就在高危拦截名单里,哪怕指纹校验通过,这个UA也会触发拦截规则。
  • 日志中出现的old SSL session ID is stale, removing和本次403完全无关:这只是cURL本地TLS会话缓存过期的常规提示,不是拦截原因。

可行的解决方向

  • 放弃使用原生cURL/PHP cURL扩展直接请求的方案:这类客户端的TLS指纹固定,靠调参数永远绕不过前置校验。可以切换为和真实Chrome TLS指纹完全一致的HTTP客户端,这类客户端会完整模拟Chrome的TLS握手流程、HTTP2发送帧结构、请求头排列顺序,指纹和真实浏览器无差异,不需要额外执行JS挑战就能拿到200响应。
  • 如果必须保留现有PHP技术栈:可以将请求代理到本地运行的无头浏览器完成转发,无头浏览器使用的是Chrome原生的网络栈,指纹完全和真实用户一致,不会被前置规则拦截。
  • 调整请求时注意保持和Chrome完全一致的请求头顺序:Cloudflare除了校验TLS指纹,还会校验HTTP头的排列顺序,哪怕TLS指纹匹配,只要头的顺序和真实Chrome不一致,依然会被拦截。
  • 避免使用爬虫类、抓取类的User-Agent:这类UA本身就在Cloudflare的高危标识列表中,哪怕指纹匹配,也会触发更严格的校验规则。

内容的提问来源于stack exchange,提问作者Hamboy75

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.23 14:54:03