如何通过PHP检测发起XMLHttpRequest的JS文件来源?
PHP无法原生、无前置配置地100%精准识别发起XMLHttpRequest的具体JS文件,原因如下:
- 浏览器发起XHR请求时,默认携带的HTTP头仅包含请求地址、请求方法、当前页面Referer、通用XHR标识
X-Requested-With: XMLHttpRequest等信息,不会自动附带触发请求的具体JS文件名,不同JS文件发起的同地址请求,默认请求结构没有任何可区分的原生特征。 Referer请求头仅能标识当前请求所属的页面URL,无法定位到页面内执行的具体JS文件,且该头可通过前端配置、浏览器设置、抓包工具随意篡改或禁用,完全不具备校验可信度。
可落地的校验实现方案
你可以通过在前端请求侧主动加标识的方式,让PHP完成来源识别,以下是常用的几种方案:
方案1:自定义请求头(实现成本最低)
在DataSync.JS内编写XHR请求逻辑时,手动添加专属自定义请求头,PHP端校验该头的取值即可识别来源。DataSync.JS侧代码示例:
const xhr = new XMLHttpRequest(); xhr.open('GET', '/?myrequest'); // 新增专属来源标识头 xhr.setRequestHeader('X-Request-Source', 'datasync'); xhr.send();
PHP端校验逻辑:
<?php // 第一步:校验是否为XHR请求 $isValidXhr = strtolower($_SERVER['HTTP_X_REQUESTED_WITH'] ?? '') === 'xmlhttprequest'; // 第二步:校验自定义来源头 $isFromDataSync = ($_SERVER['HTTP_X_REQUEST_SOURCE'] ?? '') === 'datasync'; if ($isValidXhr && $isFromDataSync) { // 来源匹配,执行业务逻辑 } else { // 来源非法,拒绝访问 http_response_code(403); exit("Invalid request source"); }
注意:自定义请求头可被抓包工具篡改,该方案仅适合做基础来源区分,不能作为防恶意请求的强安全校验手段。
方案2:动态签名校验(安全性更高)
如果需要避免标识被轻易仿造,可以给DataSync.JS的请求增加动态签名逻辑,PHP端通过验签确认来源。
约定规则:前后端持有相同的自定义盐值,请求时携带当前时间戳、基于「时间戳+盐值」生成的哈希签名,PHP端校验时间戳是否在有效期内、签名是否匹配即可。DataSync.JS侧代码示例:
const SECRET_SALT = "your_private_salt_123"; // 和PHP端配置完全一致 const reqTimestamp = Date.now(); // 生成签名,可根据项目技术栈选择MD5、SHA256等哈希算法 const reqSign = md5(reqTimestamp + SECRET_SALT); const xhr = new XMLHttpRequest(); xhr.open('GET', `/?myrequest&t=${reqTimestamp}&sign=${reqSign}`); xhr.send();
PHP端校验逻辑:
<?php const SECRET_SALT = "your_private_salt_123"; $reqTimestamp = intval($_GET['t'] ?? 0); $reqSign = $_GET['sign'] ?? ''; // 校验时间戳有效性,允许5分钟内的请求误差 if (abs(time() - intval($reqTimestamp / 1000)) > 300) { http_response_code(403); exit("Request expired"); } // 校验签名 $serverSign = md5($reqTimestamp . SECRET_SALT); if (!hash_equals($serverSign, $reqSign)) { http_response_code(403); exit("Invalid signature"); } // 校验通过,执行业务逻辑
方案3:构建流程自动注入标识
如果项目使用Vite、Webpack、Rollup等构建工具,可以在构建阶段通过插件自动给每个JS文件内的请求注入对应文件名标识,无需手动给每个请求加配置,维护成本更低。
内容的提问来源于stack exchange,提问作者ML Studios
相关产品推荐
相关产品推荐

