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

PHP Session登录异常:直接访问用户页跳转至登录页问题求解

解决PHP Session登录后直接访问用户页跳转异常的问题

问题根源

  1. 登录验证缺失:UserProfile.php未先检查用户是否已登录,直接读取$_SESSION['User'],未登录时该变量不存在,导致后续SQL查询出错
  2. 跳转逻辑错误:当查询不到用户时,代码错误跳回UserProfile.php,形成死循环,最终浏览器会终止循环并跳转至登录页(或直接报错)
  3. 安全隐患:Login.php将用户密码存入Session,存在泄露风险;SQL语句直接拼接用户输入,有注入漏洞

修复方案

1. 给UserProfile.php添加前置登录验证

在页面最开头(加载模板前)加入Session检查,确保只有已登录用户能访问:

<?php
session_start();
require_once('../config/template.php');
require_once('../config/connect.php');

// 新增:先验证登录状态,未登录直接跳登录页
if(!isset($_SESSION['User']) || empty($_SESSION['User'])){
    header('Location: Login.php');
    exit();
}

// HEADER部分代码保持不变
$templateEngine1 = new TempEngine();
$templateEngine1->loadTemplate('../template/Header.htm');
// ... 后续代码正常保留

2. 修正UserProfile.php的用户查询逻辑

替换原有的查询代码,同时修复跳转逻辑,改用预处理语句防止注入:

$UserTxt = $_SESSION['User'];
// 使用预处理语句避免SQL注入
$UserSql = "SELECT * FROM tbl_user WHERE Username = ?";
$stmt = $cn->prepare($UserSql);
$stmt->bind_param("s", $UserTxt);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc();

// 若查询不到用户,销毁Session并跳登录
if($result->num_rows === 0){
    session_destroy();
    header('Location: Login.php');
    exit();
}

$MemberUser = $row['Username'];
$MemberFirstname = $row['FirstName'];
$MemberLastname = $row['LastName'];
echo"Login Success";

3. 优化Login.php的Session存储

不要把密码存入Session,只保留用户名即可:

if (password_verify($LoginPass, $row['Password'])) {
    // 仅存储用户名,删除密码的Session写入
    $_SESSION['User'] = $_POST['User'];
    // 可选:存储用户ID更安全,后续查询用ID替代用户名
    // $_SESSION['user_id'] = $row['id'];
    header('Location: UserProfile.php');
    exit();
}

4. 修复Login.php的SQL注入问题

同样改用预处理语句:

if(isset($_POST['Submit'])){
    $LoginUser = $_POST['User'];
    $LoginPass = $_POST['Password'];
    
    if (empty($LoginUser) || empty($LoginPass)){
        echo "<div class='Error'>All fields are required.</div>";
    }else{
        // 预处理语句查询用户
        $UserIn = "SELECT * FROM tbl_user WHERE Username = ?";
        $stmt = $cn->prepare($UserIn);
        $stmt->bind_param("s", $LoginUser);
        $stmt->execute();
        $result = $stmt->get_result();
        $row = $result->fetch_assoc();
        
        if(!$row){
            echo "<div class='Error'>Username doesn't exist</div>";
        }else{
            if (password_verify($LoginPass, $row['Password'])) {
                $_SESSION['User'] = $LoginUser;
                header('Location: UserProfile.php');
                exit();
            } else {
                echo "<div class='Error'>Invalid Password</div>";
            }
        }
    }   
}

额外提醒

  • 所有需要登录的页面,必须在输出任何内容(包括空格、换行)之前调用session_start()
  • 可以把登录验证逻辑封装成公共函数(比如check_login()),在需要的页面引入调用,减少重复代码
  • 可通过session_set_cookie_params()设置Session的有效期和安全属性,提升安全性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 15:48:09