PHP库存管理系统线上环境新注册用户可见他人数据如何解决?
解决PHP库存管理系统跨用户数据访问问题的详细操作步骤
首先第一时间临时关闭线上注册入口,避免更多用户接触到非自有数据引发泄露风险,再按以下步骤修复:
步骤1:修正用户身份标识的存储逻辑
用户注册/登录验证通过后,必须将用户唯一ID写入服务端session,禁止把可篡改的用户ID存在前端Cookie中,Cookie仅允许存储服务端颁发的无意义SessionID:
// 注册/登录逻辑验证成功后执行 session_start(); // $user为当前注册/登录成功的用户数据表记录,取主键id存入session $_SESSION['user_id'] = $user['id'];
步骤2:补全所有私有数据查询的用户过滤条件
所有涉及用户私有数据(库存、订单、个人信息等)的查询语句,必须强制加上user_id = 当前登录用户ID的过滤条件,禁止直接不带条件查全表:
- 错误写法(你当前大概率是这种逻辑):
// 未加用户过滤,返回所有用户的库存数据 $sql = "SELECT * FROM inventory";
- 正确写法:
session_start(); // 先校验登录状态,未登录直接跳转登录页 if (!isset($_SESSION['user_id'])) { header("Location: login.php"); exit; } // 用预处理查询加用户过滤,同时避免SQL注入风险 $stmt = $pdo->prepare("SELECT * FROM inventory WHERE user_id = ?"); $stmt->execute([$_SESSION['user_id']]); $current_user_inventory = $stmt->fetchAll(PDO::FETCH_ASSOC);
步骤3:增加全局身份校验逻辑
抽取公共校验文件,所有需要登录才能访问的页面顶部统一引入,避免每个页面重复写校验逻辑:
// common.php 全局公共文件 session_start(); // 定义无需登录即可访问的页面白名单 $public_page = ['login.php', 'register.php']; $current_page = basename($_SERVER['PHP_SELF']); // 非白名单页面未登录直接跳转登录 if (!in_array($current_page, $public_page) && !isset($_SESSION['user_id'])) { header("Location: login.php"); exit; }
步骤4:本地功能验证
- 注册2个不同的测试账号,分别为两个账号录入不同的测试数据
- 切换登录两个账号,确认各自仪表盘只能看到自己录入的内容
- 测试未登录状态直接访问仪表盘地址,确认会自动跳转到登录页
步骤5:线上发布验证
- 发布前先完整备份线上现有代码和数据库,方便出错后快速回滚
- 发布完成后先用测试账号在线上环境重复2次上述验证流程,确认没有跨用户数据问题后再开放注册入口
内容的提问来源于stack exchange,提问作者Bismark
相关产品推荐
相关产品推荐

