Jupyter Notebook提交HTML表单遇403错误:XSRF Cookie与POST参数不匹配
解决CSRF令牌不匹配的403错误
你的核心问题是:每次渲染表单时都会调用generateCSRFToken(),这会重新生成令牌并覆盖Session中的值。当你提交表单时,Session里的令牌已经是页面刷新后的新值,和表单里的旧令牌自然不匹配,直接触发403错误。
修复步骤
修改令牌生成逻辑,复用已有令牌
只在Session中没有令牌时才生成新的,避免每次加载页面都覆盖旧令牌:function generateCSRFToken() { // 优先返回Session中已存在的令牌,无则生成新令牌 if (isset($_SESSION['csrf_token'])) { return $_SESSION['csrf_token']; } $token = bin2hex(random_bytes(32)); $_SESSION['csrf_token'] = $token; return $token; }确保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
相关产品推荐
相关产品推荐

