You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 18:57:49