PHP Session登录异常:直接访问用户页跳转至登录页问题求解
解决PHP Session登录后直接访问用户页跳转异常的问题
问题根源
- 登录验证缺失:UserProfile.php未先检查用户是否已登录,直接读取
$_SESSION['User'],未登录时该变量不存在,导致后续SQL查询出错 - 跳转逻辑错误:当查询不到用户时,代码错误跳回
UserProfile.php,形成死循环,最终浏览器会终止循环并跳转至登录页(或直接报错) - 安全隐患: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
相关产品推荐
相关产品推荐

