PHP无法直接验证JS请求来源,只能通过X-Requested-By头、Origin/Referer校验及一次性Token等手段识别合法前端上下文并防范伪造。

PHP无法直接验证“JS的请求来源”,因为JavaScript运行在浏览器中,所有它发出的请求(如AJAX、fetch)本质上仍是HTTP请求,服务端只能看到请求头和参数,看不到“是哪段JS发的”。真正能做的是:**识别请求是否来自你预期的前端上下文**,并防范伪造。核心思路是结合客户端标记 + 服务端校验,而非信任JS本身。
用自定义请求头标识JS发起的请求
这是最常用且可控的方式。前端JS在发送请求时主动添加一个约定好的请求头,PHP后端检查该头是否存在且合法:
- 前端示例(fetch):fetch('/api/data.php', { headers: { 'X-Requested-By': 'frontend-js' } })
- PHP校验:if ($_SERVER['HTTP_X_REQUESTED_BY'] ?? '' !== 'frontend-js') { http_response_code(403); exit('非法调用'); }
- 注意:需确保Web服务器(如Nginx/Apache)未过滤掉自定义头;若用Apache,可能需在.htaccess中添加SetEnvIfNoCase X-Requested-By ^(.*)$ X_REQUESTED_BY=$1
结合Referer与Origin双重判断
对非跨域或同源AJAX请求,可同时检查两个关键头,提高可信度:
- $_SERVER['HTTP_REFERER']:表示跳转来源页面URL(但可能为空或被浏览器策略清空)
- $_SERVER['HTTP_ORIGIN']:AJAX请求专有头,明确声明发起源(如https://your-site.com),更可靠
- 建议逻辑:if (!isset($_SERVER['HTTP_ORIGIN']) || parse_url($_SERVER['HTTP_ORIGIN'], PHP_URL_HOST) !== 'your-site.com') { ... }
用一次性Token防止重放与伪造
仅靠头信息易被curl等工具模仿。更安全的做法是:前端JS从PHP获取一个短期有效的token,随请求一起提交,PHP验证其存在性、时效性和签名:
立即学习“PHP免费学习笔记(深入)”;
- PHP生成token(存session或Redis):$token = bin2hex(random_bytes(16)); $_SESSION['ajax_token'] = ['val' => $token, 'exp' => time() + 300];
- 前端JS读取并携带:headers: { 'X-Token': '...' }
- PHP验证:if (!hash_equals($_SESSION['ajax_token']['val'] ?? '', $_SERVER['HTTP_X_TOKEN'] ?? '')) { ... },验证后立即失效
区分AJAX与普通页面请求
很多场景只需知道“是不是通过JS异步请求来的”,可用现成判断:
- 检查$_SERVER['HTTP_X_REQUESTED_WITH']是否为XMLHttpRequest(jQuery等库自动添加,原生fetch需手动加)
- 更稳妥方式是搭配自定义头使用,避免依赖框架行为
- 不推荐单靠此字段做权限控制,仅作辅助识别



















