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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 13:27:00