PHP登出后浏览器回退问题求助:需跳转至登录页
解决登出后浏览器回退仍能访问受保护页面的问题
嘿,我来帮你搞定这个问题!你遇到的情况其实挺典型的,主要是两个原因导致的:一是浏览器会缓存已经访问过的页面,回退时直接读缓存不请求服务器;二是那些登录后的页面没有做登录校验,就算会话销毁了,还是能直接访问。下面给你一步步的解决方案:
问题根源拆解
- 浏览器缓存坑:当你登录后访问欢迎页,浏览器会把页面存在本地,登出后回退,浏览器直接加载缓存的页面,根本不会去服务器验证会话是否还存在,所以你看起来还能“访问”页面。
- 页面无登录校验:你的
welcomemoyna.html这类页面都是静态HTML,没有任何PHP代码检查用户是否登录,就算会话没了,直接输入URL或者通过缓存都能打开。
具体解决步骤
1. 彻底销毁会话(优化logout.php)
你的logout.php只是unset了会话变量,但会话的Cookie还留在浏览器里,得彻底清掉:
<?php session_start(); // 清空所有会话变量 $_SESSION = []; // 如果会话用Cookie存储,销毁对应的Cookie if (ini_get("session.use_cookies")) { $cookieParams = session_get_cookie_params(); setcookie( session_name(), '', time() - 42000, // 设置为过去的时间,让Cookie失效 $cookieParams["path"], $cookieParams["domain"], $cookieParams["secure"], $cookieParams["httponly"] ); } // 最终销毁会话 session_destroy(); header("Location: login.php"); exit; // 一定要加exit,防止后续代码执行 ?>
2. 给所有受保护页面加登录校验(改HTML为PHP)
静态HTML没法执行PHP校验,所以得把所有欢迎页改成.php文件(比如welcomemoyna.php),然后在页面最顶部加这段代码:
<?php session_start(); // 检查用户是否登录:如果会话里没有id,直接跳登录页 if (!isset($_SESSION["id"]) || empty($_SESSION["id"])) { header("Location: login.php"); exit; } // 禁止浏览器缓存这个页面,强制回退时重新请求服务器 header("Cache-Control: no-cache, no-store, must-revalidate"); // HTTP 1.1标准 header("Pragma: no-cache"); // 兼容HTTP 1.0 header("Expires: 0"); // 告诉代理服务器不要缓存 ?> <!-- 这里放原来welcomemoyna.html的所有内容 -->
3. 修正login.php的会话逻辑
你的login.php开头先销毁了会话,这会导致登录前会话就没了,而且还有SQL注入风险,我帮你优化了:
<?php session_start(); // 先启动会话,不要一开始就销毁 $message = ""; if (count($_POST) > 0) { $con = mysqli_connect('localhost','username','password','db name') or die('Unable To connect'); // 重点:用预处理语句防止SQL注入,这是安全必备! $stmt = $con->prepare("SELECT * FROM login WHERE username = ? AND password = ?"); $stmt->bind_param("ss", $_POST["username"], $_POST["password"]); $stmt->execute(); $result = $stmt->get_result(); $row = $result->fetch_assoc(); if ($row) { $_SESSION["id"] = $row['id']; // 加上引号,避免未定义常量警告 $_SESSION["username"] = $row['username']; // 用数组存跳转关系,比一堆elseif清爽多了 $redirectMap = [ 'moyna' => 'welcomemoyna.php', 'ramtarak' => 'welcomeramtarak.php', 'tamluk' => 'welcometamluk.php', 'bagnan' => 'welcomebagnan.php', 'admin' => 'welcomeadmin.php', 'quickd' => 'welcomequickd.php' ]; if (isset($redirectMap[$_POST["username"]])) { header("Location: " . $redirectMap[$_POST["username"]]); exit; } else { $message = "抱歉,该用户没有配置跳转页面!"; } } else { $message = "用户名或密码错误!"; } } ?> <html> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" /> <meta name="description" content="" /> <meta name="author" content="" /> <title>Quick Group</title> <link href="assets/css/bootstrap.css" rel="stylesheet" /> <link href="assets/css/font-awesome.min.css" rel="stylesheet" /> <link href="assets/css/flexslider.css" rel="stylesheet" /> <link href="assets/css/style.css" rel="stylesheet" /> <link href='http://fonts.googleapis.com/css?family=Open+Sans:400,700,300' rel='stylesheet' type='text/css' /> <title>User Login</title> </head> <body> <div class="navbar navbar-inverse navbar-fixed-top " id="menu"> <div class="container"> <div class="navbar-header"> <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse"> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand" href="#">QUICK GROUP</a> </div> <div class="navbar-collapse collapse move-me"> <ul class="nav navbar-nav navbar-right"> <li ><a href="index.html">HOME</a></li> <li><a href="#">FEATURES</a></li> <li><a href="#">COURSES</a></li> <li><a href="#">CONTACT</a></li> <li><a href="login.php">LOGIN</a></li> </ul> </div> </div> </div> <br> <br> <br> <br> <form name="frmUser" method="post" action="" align="center"> <div class="message"><?php if($message!="") { echo $message; } ?></div> <h3 align="center">Enter Login Details</h3> Username:<br> <input type="text" name="username"> <br> Password:<br> <input type="password" name="password"> <br><br> <input type="submit" name="submit" value="Submit"> <input type="reset"> </form> <center> <a href="passwordchange.php">Change password</a> </center> </body> </html>
额外的安全提醒
- 密码存储:现在你是明文存密码,这绝对不安全!应该用
password_hash()加密后存到数据库,登录时用password_verify()验证,比如注册时:$hashedPwd = password_hash($password, PASSWORD_DEFAULT);,登录时:if (password_verify($_POST["password"], $row['password'])) { ... }。 - SQL注入:之前的代码直接把用户输入拼到SQL里,很容易被攻击,我给你改成了预处理语句,一定要用这种方式!
内容的提问来源于stack exchange,提问作者Debayan Mondal
相关产品推荐
相关产品推荐

