需严格模拟浏览器请求头:设置合法referer与origin、主流user-agent、x-requested-with等,header键名用pascalcase,避免重复设置或重定向丢失头,且token须在2分钟内使用。

PHP cURL 请求中怎么覆盖 AJ-Captcha 的前端请求头
AJ-Captcha 的校验逻辑会检查 Referer、Origin、User-Agent 甚至自定义头(如 X-Requested-With)是否匹配前端真实环境。用 PHP 后端代发请求时,若直接 curl_setopt($ch, CURLOPT_URL, $captcha_api),默认头往往触发校验失败,返回 403 或 {"success":false,"msg":"非法请求"}。
关键不是“改”,而是“模拟”——让 PHP cURL 发出的请求头看起来和浏览器一致:
-
Referer必须设为合法的业务域名(如https://example.com/login),不能为空或乱填 -
Origin需与Referer协议+域名一致(如https://example.com),AJ-Captcha 前端 SDK 通常会读取它做跨域校验 - 必须带上
User-Agent,且不能是 cURL 默认值(如curl/7.68.0),建议用 Chrome 当前主流 UA 字符串 - 如果前端 JS 初始化时传了
options.headers(比如加了X-Token),PHP 请求也得同步带上
为什么 setopt(CURLOPT_HTTPHEADER) 有时没生效
常见原因是头字段名大小写不规范或重复设置。AJ-Captcha 后端可能用严格匹配(如只认 Origin,不认 origin 或 ORIGIN),而 PHP cURL 对大小写不敏感,但服务端框架(如 Spring Boot 的 @RequestHeader)可能区分。
实操要点:
- 所有 header 键名首字母大写,后续单词首字母也大写(即 PascalCase),例如:
Origin、Referer、X-Requested-With - 避免用
curl_setopt($ch, CURLOPT_HEADER, true),它会把响应头也混进 body,干扰 JSON 解析 - 不要同时用
curl_setopt($ch, CURLOPT_USERAGENT, ...)和CURLOPT_HTTPHEADER里再写User-Agent,后者会覆盖前者,但容易漏掉;统一用HTTPHEADER更可控 - 检查是否启用了
CURLOPT_FOLLOWLOCATION:重定向后请求头不会自动继承,需手动处理或禁用跳转
PHP 示例:发送带完整伪造头的校验请求
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.example.com/verify');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(['token' => $token, 'scene' => 'login']));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Origin: https://example.com',
'Referer: https://example.com/login',
'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36',
'X-Requested-With: XMLHttpRequest',
// 若前端加了自定义头,这里必须一并带上
// 'X-Session-ID: abc123'
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
注意:$token 是前端调用 ajCaptcha.show() 后拿到的 token,不是后端生成的;AJ-Captcha 的 token 有极短有效期(通常 2 分钟),PHP 请求必须在 token 有效期内发出。
绕过 Referer 校验的边界情况
有些部署会把 AJ-Captcha 接入 Nginx 做反向代理,并在 location 块里用 add_header 强制加头,但 PHP cURL 无法控制 Nginx 行为。这时真正起作用的是 Nginx 转发时的 proxy_set_header 配置:
- 如果 PHP 请求发给自己的 Nginx(如
http://localhost:8080/captcha/verify),确保 Nginx 配置里写了proxy_set_header Origin $http_origin;和proxy_set_header Referer $http_referer; - 如果 PHP 直连 AJ-Captcha 官方服务(如
https://captcha-api.aj-captcha.com),那只能靠 cURL 自己设头,Nginx 不介入 - 部分企业版支持白名单域名豁免 Referer 检查,此时 PHP 请求头可简化,但需提前在控制台配置
example.com为合法来源
最易被忽略的是时间差:前端生成 token 和 PHP 发起校验之间若超时,哪怕头全对也会返回 token expired —— 这个错误和头无关,但排查时容易误判。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











