PHP开发:如何实现用户退出登录后无法返回访问后台仪表盘
退出登录后仍可访问仪表盘问题修复方案
核心问题原因
- 最根本的问题是
dashboard.php没有添加登录状态校验逻辑,你现有的auth.php仅处理登录提交时的账号密码校验,没有对仪表盘等需要登录的页面做访问权限控制,用户退出后直接访问仪表盘地址或者通过浏览器后退读取缓存都能进入页面。 logout.php的session销毁逻辑不完整,也没有添加缓存控制头,浏览器可能会缓存之前的仪表盘页面导致后退就能访问。- 额外安全隐患:
auth.php中直接明文比对数据库存储的密码,存在严重的信息泄露风险。
修复步骤
步骤1:新增全局登录状态校验文件
新建check_login.php,所有需要登录才能访问的页面(比如dashboard.php)都要在顶部引入这个文件:
<?php session_start(); // 校验登录标识是否存在 if (!isset($_SESSION['email']) || empty($_SESSION['email'])) { // 禁用页面缓存,防止浏览器后退读取缓存 header("Cache-Control: no-cache, no-store, must-revalidate"); header("Pragma: no-cache"); header("Expires: 0"); header("Location: login.php"); exit(); } ?>
在dashboard.php最顶部第一行添加引入代码,确保所有输出前完成校验:
<?php include 'check_login.php'; ?>
步骤2:修复logout.php的销毁逻辑
替换原有logout.php代码:
<?php session_start(); // 清空当前session数组 $_SESSION = []; // 销毁服务端session session_destroy(); // 清除客户端session cookie,彻底销毁登录状态 if (isset($_COOKIE[session_name()])) { setcookie(session_name(), '', time() - 3600, '/'); } // 添加缓存控制头 header("Cache-Control: no-cache, no-store, must-revalidate"); header("Pragma: no-cache"); header("Expires: 0"); header("Location: login.php"); exit(); ?>
步骤3(可选安全优化):修复明文密码校验问题
数据库存储密码时改用password_hash()加密存储,修改auth.php的密码校验逻辑:
// 原有明文比对逻辑替换为: if (password_verify($password, $row['password'])) { $_SESSION['email'] = $row['email']; header("Location: dashboard.php"); exit(); }
内容的提问来源于stack exchange,提问作者Cj_Cipher
相关产品推荐
相关产品推荐

