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

基于JSON文件的PHP登录:如何用Session限制URL直接访问

这个问题很典型——前端验证虽然方便,但完全拦不住懂点技术的人绕开直接访问。要解决这个,我们得把服务器端的Session验证加上,让服务器来把控谁能访问受保护的页面。下面是具体的改造步骤:

1. 重构登录验证逻辑(把验证移到PHP端)

原来前端直接读取login.json验证的做法其实不安全(任何人都能下载你的用户列表),所以我们把验证逻辑放到PHP文件里,前端只负责提交账号密码。

修改前端JavaScript代码

把原来请求login.json的代码改成请求PHP处理脚本,比如login_process.php:

$(document).ready(function () {
    $('#login').click(function () {
        var email = $('#email').val();
        var pass = $('#pass').val();
        
        // 先做简单的非空校验
        if (!email || !pass) {
            alert('请输入邮箱和密码!');
            return false;
        }

        $.ajax({
            type: "POST",
            url: "login_process.php", // 改成PHP处理文件
            data: {email: email, pass: pass}, // 提交账号密码
            dataType: "json",
            success: function (response) {
                if (response.success) {
                    // 验证成功,跳转到主页
                    document.location = "index.php";
                } else {
                    // 验证失败,清空输入框并提示
                    $('#email').val('');
                    $('#pass').val('');
                    alert('请检查你的邮箱或密码!');
                }
            },
            error: function() {
                alert('服务器出错,请稍后重试!');
            }
        });
        return false;
    });
});
2. 创建PHP登录处理脚本 login_process.php

这个文件负责读取json用户数据、验证账号密码,并且创建Session标记用户已登录:

<?php
// 开启Session
session_start();

// 接收前端提交的数据
$email = $_POST['email'] ?? '';
$pass = $_POST['pass'] ?? '';

// 读取并解析JSON用户文件
$users = json_decode(file_get_contents('login.json'), true);

$is_valid = false;
// 遍历用户列表验证
foreach ($users as $user) {
    if ($user['email'] === $email && $user['pass'] === $pass) {
        $is_valid = true;
        break;
    }
}

if ($is_valid) {
    // 验证成功,设置Session变量
    $_SESSION['logged_in'] = true;
    $_SESSION['user_email'] = $email;
    // 返回成功结果
    echo json_encode(['success' => true]);
} else {
    // 验证失败,返回失败结果
    echo json_encode(['success' => false]);
}
?>
3. 保护受限制页面(比如 index.php)

在所有需要登录才能访问的页面顶部,加上Session检查逻辑,如果用户未登录就强制跳转到登录页:

<?php
session_start();
// 检查是否已登录
if (!isset($_SESSION['logged_in']) || $_SESSION['logged_in'] !== true) {
    // 未登录,重定向到登录页面(假设登录页是login.html)
    header('Location: login.html');
    exit;
}

// 下面是原来的index.php内容
?>
<!DOCTYPE html>
<html>
<head>
    <title>主页</title>
</head>
<body>
    <h1>欢迎回来,<?php echo $_SESSION['user_email']; ?>!</h1>
    <a href="logout.php">退出登录</a>
</body>
</html>
4. 添加退出登录功能(可选但推荐)

创建logout.php来销毁Session,让用户安全退出:

<?php
session_start();
// 销毁所有Session变量
$_SESSION = array();
// 销毁Session cookie
if (isset($_COOKIE[session_name()])) {
    setcookie(session_name(), '', time() - 42000, '/');
}
// 销毁Session
session_destroy();
// 重定向到登录页
header('Location: login.html');
exit;
?>
额外注意事项
  • 确保你的login.json文件权限设置正确,不要让外部直接访问(比如在Apache的.htaccess里添加规则禁止访问,或者把json文件放到网站根目录以外的位置)。
  • 不要在前端暴露任何敏感信息,所有验证逻辑都要放在服务器端。
  • 密码建议不要明文存储在json里,最好用哈希算法(比如password_hash())加密后存储,验证时用password_verify()校验,这样更安全。

内容的提问来源于stack exchange,提问作者MJ DEV

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:47:05