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

添加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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 13:36:06