如何限制仅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
相关产品推荐
相关产品推荐

