PHP+MySQL实现登录后访问页面,如何禁止直接访问?
解决直接访问受保护页面的问题
嘿,我明白你的需求了——现在登录功能能正常跳转,但用户只要知道welcome.php的URL就能直接访问,完全绕过登录流程,对吧?这是权限控制里的常见问题,咱们通过会话(Session)验证就能解决,下面是具体步骤和修改后的代码:
核心思路
我们需要在用户登录成功时标记其登录状态,然后在每个受保护页面的开头检查这个状态:如果未标记(也就是没登录),就强制跳回登录页面。
第一步:修改登录逻辑,添加会话标记
在loginserver.php里,我们需要启动会话,并在验证通过后记录用户的登录状态。另外,你的原代码存在SQL注入风险和明文存储密码的安全问题,我也一起帮你修正了:
<?php session_start(); // 启动会话,必须放在页面最顶部 $error=''; if(isset($_POST['submit'])){ if(empty($_POST['user']) || empty($_POST['pass'])){ $error = "Username or Password is Invalid"; } else { $user = $_POST['user']; $pass = $_POST['pass']; // 建立数据库连接 $conn = mysqli_connect("localhost", "root", "", "test"); if(!$conn) { die("连接失败: " . mysqli_connect_error()); } // 使用预处理语句防止SQL注入 $stmt = mysqli_prepare($conn, "SELECT pass FROM userpass WHERE user = ?"); mysqli_stmt_bind_param($stmt, "s", $user); mysqli_stmt_execute($stmt); mysqli_stmt_store_result($stmt); if(mysqli_stmt_num_rows($stmt) == 1){ mysqli_stmt_bind_result($stmt, $hashed_pass); mysqli_stmt_fetch($stmt); // 验证密码(注意:数据库里的密码必须是用password_hash()存储的) if(password_verify($pass, $hashed_pass)){ $_SESSION['logged_in'] = true; // 标记登录状态 $_SESSION['username'] = $user; // 可选:存储用户名用于后续展示 header("Location: welcome.php"); exit(); // 跳转后一定要退出,防止后续代码执行 } else { $error = "Username or Password is Invalid"; } } else { $error = "Username or Password is Invalid"; } mysqli_stmt_close($stmt); mysqli_close($conn); } } ?>
注意:如果你的数据库里现在是明文存储密码,需要先把现有密码改成哈希值——可以用
password_hash('原密码', PASSWORD_DEFAULT)生成哈希后更新数据库,之后登录时用password_verify()验证,这是PHP官方推荐的安全做法。
第二步:在受保护页面添加登录检查
在welcome.php的最顶部添加会话验证逻辑,确保只有登录用户才能访问:
<?php session_start(); // 启动会话 if(!isset($_SESSION['logged_in']) || $_SESSION['logged_in'] !== true){ // 如果未登录,强制跳回登录页面 header("Location: 你的登录页面URL"); // 替换成你的登录页面地址,比如login.php exit(); } ?> <!doctype html> <html> <head> <meta charset="UTF-8"> </head> <body> <h1>Welcome, <?php echo $_SESSION['username']; ?>!</h1> <!-- 可选:展示用户名 --> </body> </html>
额外安全建议
- 记得在所有需要权限控制的页面(比如后续的用户中心、设置页等)都加上同样的会话检查代码
- 可以添加会话过期逻辑,比如设置
session_set_cookie_params()来控制会话有效期 - 避免在会话中存储敏感信息,比如密码
内容的提问来源于stack exchange,提问作者Alarewyn
相关产品推荐
相关产品推荐

