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

Jupyter Notebook提交HTML表单遇403错误:XSRF Cookie与POST参数不匹配

解决CSRF令牌不匹配的403错误

你的核心问题是:每次渲染表单时都会调用generateCSRFToken(),这会重新生成令牌并覆盖Session中的值。当你提交表单时,Session里的令牌已经是页面刷新后的新值,和表单里的旧令牌自然不匹配,直接触发403错误。

修复步骤

  1. 修改令牌生成逻辑,复用已有令牌
    只在Session中没有令牌时才生成新的,避免每次加载页面都覆盖旧令牌:

    function generateCSRFToken() {
        // 优先返回Session中已存在的令牌,无则生成新令牌
        if (isset($_SESSION['csrf_token'])) {
            return $_SESSION['csrf_token'];
        }
        $token = bin2hex(random_bytes(32));
        $_SESSION['csrf_token'] = $token;
        return $token;
    }
    
  2. 确保Session初始化在最顶部
    session_start()必须在任何输出(包括HTML标签)之前执行,否则Session无法正常工作:

    <?php
    session_start();
    
    function generateCSRFToken() {
        if (isset($_SESSION['csrf_token'])) {
            return $_SESSION['csrf_token'];
        }
        $token = bin2hex(random_bytes(32));
        $_SESSION['csrf_token'] = $token;
        return $token;
    }
    
    // 仅在POST请求时验证令牌
    if ($_SERVER['REQUEST_METHOD'] === 'POST') {
        if(isset($_POST['csrf_token']) && $_POST['csrf_token'] === $_SESSION['csrf_token']) {
            // 处理表单输入逻辑
            echo "令牌验证通过,请求正常处理";
            // 可选:验证成功后销毁旧令牌,防止重复使用
            unset($_SESSION['csrf_token']);
        } else {
            echo "CSRF令牌不匹配,请求被拒绝";
            http_response_code(403);
        }
    }
    ?>
    
    <form action="user_input.php" method="POST">
    <div style="background-color:tan; border:solid black; width:900px; padding:50px;">
    
        <!-- 其他表单内容 -->
        <br>
        <input type="hidden" name="csrf_token" value="<?php echo generateCSRFToken(); ?>">
        <input type="submit" value="Submit"/>
    </div>
    </form>
    

额外注意事项

  • 不要在每次加载页面时强制生成新令牌,否则用户打开页面后刷新再提交旧页面,依然会触发验证失败。
  • 验证成功后销毁旧令牌,能进一步提升安全性,避免令牌被重复利用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 16:12:18