PHP实现的用户登录状态校验脚本运行异常问题排查求助
问题修复方案
核心问题:登录状态校验逻辑写反
当前admin_upload.php的判断条件存在逻辑错误:
if(isset($_SESSION["loggedin"]) && $_SESSION["loggedin"] !== true){
这段逻辑的含义是仅当loggedin变量存在且值不为true时才跳转,未登录状态下$_SESSION["loggedin"]本身不存在,isset()返回false,整个条件不会触发,因此未登录用户可以直接进入页面。
修复步骤
1. 修正admin_upload.php的校验逻辑
将判断条件调整为「只要未登录就跳转」,完整修正代码如下:
<?php // session_start() 必须放在所有输出之前,保持在文件最顶部 session_start(); // 正确校验逻辑:loggedin不存在 或者 值不为true,均判定为未登录,跳转登录页 if(!isset($_SESSION["loggedin"]) || $_SESSION["loggedin"] !== true){ header("Location: login.php"); exit; } // 后续业务逻辑保持不变 $name = $_SESSION["username"]; include "layout/product_add.php"; ?> <!DOCTYPE html> <html> <head> <link rel="stylesheet" href="materialize/css/materialize.min.css"/> </head> <body> </html>
注意:header中的Location首字母大写为规范写法,可避免部分环境下的跳转兼容性问题。
2. 优化login.php的逻辑与安全性
session_start()需放在PHP文件最顶部,避免之前产生输出导致session写入失败- 修复SQL注入漏洞,改用预处理查询替代直接拼接用户输入的参数
- 建议将账号密码的传输方式从GET改为POST,避免信息留在浏览器历史、服务器日志中
优化后的login.php参考代码:
<?php // session_start 放在文件最顶部 session_start(); $conn = mysqli_connect("localhost","root","","rating"); if(!$conn){ echo "Connection to database was unsuccesful"; exit; } $username = trim($_GET["p"]); $password = trim($_GET["q"]); // 用预处理查询避免SQL注入 $stmt = mysqli_prepare($conn, "SELECT Password FROM Admin WHERE username = ?"); mysqli_stmt_bind_param($stmt, "s", $username); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); if(mysqli_num_rows($result) == 1){ $row = mysqli_fetch_assoc($result); if(password_verify($password, $row['Password'])){ // 校验成功写入session $_SESSION["username"] = $username; $_SESSION["loggedin"] = true; echo "password verification passed"; // 可按需增加登录成功后的跳转逻辑 // header("Location: admin_upload.php"); // exit; }else{ echo "Incorrect password"; } }else{ echo "No account with that username was found"; } // 释放资源 mysqli_stmt_close($stmt); mysqli_close($conn); ?>
额外注意
所有需要登录权限的页面,都必须在文件最顶部加上上述的session校验逻辑,避免出现权限绕过漏洞。
内容的提问来源于stack exchange,提问作者user16612111
相关产品推荐
相关产品推荐

