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

AJAX请求携带CSRF Token提示无效,求排查错误原因

解决CSRF Token验证"invalid"的问题

嘿,我帮你梳理下代码里的几个核心问题,这些就是你一直收到"invalid"提示的原因:

1. 前端Token输出的语法错误

在world.php的隐藏输入框里,你写了这样的代码:

<input type="hidden" class="csrf_token" value="<?= echo $_SESSION['csrf_token']; ?>">

这里的<?=是PHP的短输出标签,它本身就等价于<?php echo,你额外加的echo会导致输出异常——最终生成的token值前面会多一个1(因为echo函数执行成功会返回1),这就导致前端发送的token和后端session里的完全不匹配。

正确的写法应该去掉多余的echo:

<input type="hidden" class="csrf_token" value="<?= $_SESSION['csrf_token']; ?>">

或者用完整的PHP输出标签:

<input type="hidden" class="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">

2. 每次请求都重置了Session里的Token

你的connect.php中有这样一行:

$_SESSION['csrf_token'] = bin2hex(random_bytes(16));

如果这个文件被world.php和show_user.php都引入的话,就会出现这个问题:

  • 用户打开world.php时,生成了一个Token并存在Session里
  • 触发AJAX请求show_user.php时,show_user.php又加载了connect.php,直接覆盖生成了新的Token
    这时候前端发送的是旧Token,而后端Session里已经是新Token了,验证自然失败。

解决方法是只在Session中没有Token的时候才生成:

if (!isset($_SESSION['csrf_token'])) {
    $_SESSION['csrf_token'] = bin2hex(random_bytes(16));
}

这样只会在用户第一次访问(或Session过期)时生成一次Token,不会每次请求都重置。

额外的小优化建议(非CSRF问题)

你给表单绑定的是input事件,每输入一个字符就会触发一次AJAX请求,这会导致后端收到大量重复请求。如果需求是用户输入完成后再查询,可以考虑用防抖函数(debounce),或者换成change/blur事件,不过这个和当前的CSRF验证失败无关,只是个小建议。

你可以在show_user.php里先打印两个Token的值,快速验证问题是否解决:

echo "前端发送的Token: " . $_POST['csrf_token'] . "<br>";
echo "Session里的Token: " . $_SESSION['csrf_token'] . "<br>";

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:15:18