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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:07:46