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

如何限制仅DataTables发起的请求可访问数据源接口getData.php

PHP侧限制接口仅允许DataTables请求访问的实现方案

下面是几种可落地的后端防护方案,防护强度从低到高:

1. 校验AJAX专属请求头

普通用户直接在浏览器地址栏访问接口属于标准GET请求,而DataTables发起的AJAX请求会默认携带X-Requested-With: XMLHttpRequest请求头,可以基于这个特征做第一层校验:
在getData.php的最开头加入以下代码:

// 校验是否为AJAX请求
if (!isset($_SERVER['HTTP_X_REQUESTED_WITH']) || strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) !== 'xmlhttprequest') {
    http_response_code(403);
    exit('禁止访问');
}

该方案实现简单,可阻挡绝大多数普通用户直接访问的场景,缺点是请求头可被伪造,无法阻挡刻意模拟请求的爬虫。

2. CSRF令牌校验(最推荐)

该方案安全性最高,通过会话绑定唯一校验令牌,无合法令牌的请求会被直接拒绝:

第一步:在表格页生成令牌

在渲染DataTables表格的PHP页面(即用户正常访问的表格前端页)中,初始化session并生成令牌:

<?php
session_start();
// 生成随机令牌存入session
$datatableToken = bin2hex(random_bytes(32));
$_SESSION['datatable_access_token'] = $datatableToken;
?>

第二步:修改DataTables配置,请求时携带令牌

$table.dataTable({
    ajax: {
        url: 'path/to/getData.php',
        type: 'POST', // 改为POST请求避免令牌出现在URL日志中
        data: {
            access_token: '<?php echo $datatableToken; ?>'
        }
    }
});

第三步:在getData.php中校验令牌

<?php
session_start();
http_response_code(403);
// 先校验请求方式
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    exit('禁止访问');
}
// 校验令牌合法性
if (!isset($_POST['access_token']) || $_POST['access_token'] !== $_SESSION['datatable_access_token']) {
    exit('禁止访问');
}
// 校验通过后再执行数据库查询等后续逻辑

3. 来源域名校验(补充防护)

可额外加一层来源域名校验,进一步提升爬虫伪造成本:

// 替换为你自己的域名
$allowDomain = 'mywebsite.com';
if (!isset($_SERVER['HTTP_REFERER']) || parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST) !== $allowDomain) {
    http_response_code(403);
    exit('禁止访问');
}

注意HTTP_REFERER头存在缺失或被伪造的可能,仅可作为补充防护,不能作为唯一校验逻辑。

补充说明:不存在100%防止接口被爬取的方案,只要前端页面能正常请求到数据,刻意抓包的爬虫就可以模拟合法请求,上述方案可以有效阻挡普通用户直接访问、以及绝大多数无差别爬虫的爬取行为。

内容的提问来源于stack exchange,提问作者Bijan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 00:36:03