PHP cURL请求Cloudflare站点报403错误1020走Fiddler代理正常原因查询
问题原因分析
Cloudflare返回error code: 1020代表请求触发了站点配置的自定义防火墙拦截规则,该现象和SSL证书无关:你的代码中已经通过CURLOPT_SSL_VERIFYHOST、CURLOPT_SSL_VERIFYPEER关闭了SSL证书校验,Fiddler的自签名证书不会对请求结果产生影响。加Fiddler代理后请求正常的常见原因如下:
- TLS/JA3指纹匹配拦截:cURL默认的TLS握手特征(JA3指纹)属于明确的爬虫特征,Cloudflare的指纹识别库会直接标记拦截。Fiddler转发请求时会使用自身的TLS协议栈与Cloudflare建立连接,JA3指纹和常规浏览器特征一致,因此可以绕过拦截。
- 请求格式异常被自动修正:你的代码存在两处请求格式不匹配问题:
- POST提交的payload是JSON格式,但请求头
Content-Type配置为application/x-www-form-urlencoded,格式不匹配 Content-Length取值为strlen($data),但CURLOPT_POSTFIELDS使用的是硬编码的JSON字符串,和$data变量的实际长度可能不一致
Cloudflare会校验请求头和请求体的一致性,格式异常会直接触发拦截。Fiddler转发请求时会自动校正错误的请求头参数,因此修正后的请求可以正常通过校验。
- POST提交的payload是JSON格式,但请求头
- IPv6访问拦截:如果你的网络同时支持IPv4/IPv6,cURL默认会优先使用IPv6发起请求,很多站点的Cloudflare规则会拦截异常IPv6段的请求。Fiddler默认仅转发IPv4请求,因此切换为IPv4访问后就可以正常请求。
- 自动补全验证Cookie:如果你之前通过浏览器配合Fiddler访问过目标站点,Fiddler会自动将浏览器生成的
cf_clearance等Cloudflare验证Cookie附加到转发的请求中,而直接用cURL请求时没有这类有效验证Cookie,就会触发拦截。
修复建议
先修正代码中的请求格式错误,将Content-Type改为application/json,同时保证CURLOPT_POSTFIELDS和Content-Length取值匹配;如果还是被拦截,可以替换原生cURL,使用支持模拟浏览器TLS指纹的Cloudflare专用爬取库即可。
内容的提问来源于stack exchange,提问作者Imran Ahmed
相关产品推荐
相关产品推荐

