添加generateToken()函数后登录页面无法跳转,求排查原因
登录跳转失效问题(添加CSRF Token后)
问题描述
课程作业的社交媒体页面,登录页原本可正常跳转到主页,但添加generateToken()函数后,提交表单仅刷新页面、清空输入框,无法完成登录跳转;移除该函数后功能恢复正常。
问题根源
在login.php中,每次页面加载(包括表单提交的POST请求)都会调用generateToken(),这会直接覆盖$_SESSION['token']的值。用户提交表单时,表单里携带的是页面首次加载时生成的旧token,但此时session中的token已经被重新生成的新值替换,导致validateToken()验证失败,后续的登录逻辑根本没机会执行。
解决方案
仅在**GET请求(页面首次加载)**时生成CSRF Token,POST请求时不重新生成,保证表单提交的token和session中存储的token一致。
修改后的login.php代码
<?php session_start(); include("connection.php"); include("functions.php"); // 仅在GET请求页面首次加载时生成CSRF Token if ($_SERVER['REQUEST_METHOD'] == "GET") { generateToken(); } // 检查表单提交状态及CSRF Token有效性 if ($_SERVER['REQUEST_METHOD'] == "POST" && isset($_POST['token']) && validateToken($_POST['token'])) { // 获取用户输入 $userEmail = $_POST['userEmail']; $userPassword = $_POST['userPassword']; // 检查邮箱和密码非空 if (!empty($userEmail) && !empty($userPassword)) { // 准备SQL查询 $sqlQuery = $con->prepare("SELECT * FROM Users WHERE userEmail = ? LIMIT 1"); $sqlQuery->bind_param("s", $userEmail); if ($sqlQuery->execute()) { $result = $sqlQuery->get_result(); $user_data = $result->fetch_assoc(); // 验证用户存在且密码匹配 if ($user_data && password_verify($userPassword, $user_data['userPassword'])) { $_SESSION['userID'] = $user_data['userID']; // 登录成功后销毁旧token,防止重复利用 unset($_SESSION['token']); header("Location: home_page.html"); exit; } } } } ?>
额外说明
- 登录成功后销毁旧token是可选但推荐的操作,能避免该token被恶意重复提交,提升安全性。
- 原有
functions.php和HTML表单代码无需修改,保持原样即可。
内容的提问来源于stack exchange,提问作者Ben Fullerton
相关产品推荐
相关产品推荐

