PHP开发userads页面显示所有用户广告问题及代码修改需求
问题分析与修改方案
核心问题
你的userads页面未对广告图片添加当前登录用户ID的过滤逻辑,导致拉取并展示了服务器上所有用户的图片资源。
常见未过滤场景的修改方案
场景1:从数据库读取广告记录
假设你当前的查询代码未做用户过滤,类似这样:
// 未过滤的错误写法 $stmt = $pdo->query("SELECT * FROM ads_images"); $all_ads = $stmt->fetchAll(PDO::FETCH_ASSOC);
修改步骤:
- 确保登录时已将用户ID存入会话:
// 登录成功时执行 session_start(); $_SESSION['user_id'] = $user_id; // $user_id为当前用户的数据库唯一标识
- 带用户ID过滤查询:
session_start(); // 校验用户是否登录,未登录则跳转登录页 if (!isset($_SESSION['user_id'])) { header("Location: login.php"); exit; } $user_id = $_SESSION['user_id']; // 绑定用户ID参数,避免SQL注入 $stmt = $pdo->prepare("SELECT * FROM ads_images WHERE user_id = ?"); $stmt->execute([$user_id]); $user_ads = $stmt->fetchAll(PDO::FETCH_ASSOC);
之后遍历$user_ads渲染图片即可。
场景2:直接读取服务器图片目录
假设你当前直接遍历整个上传目录,类似这样:
// 未过滤的错误写法 $images = glob('/path/to/uploads/*');
修改步骤:
- 上传逻辑提前优化:按用户ID划分存储目录,比如上传时将图片存入
/uploads/user_{$user_id}/ - 读取时仅访问当前用户的目录:
session_start(); if (!isset($_SESSION['user_id'])) { header("Location: login.php"); exit; } $user_id = $_SESSION['user_id']; $user_upload_dir = "/path/to/uploads/user_{$user_id}/"; // 仅读取当前用户目录下的图片文件 $images = glob($user_upload_dir . "*.{jpg,jpeg,png,gif}", GLOB_BRACE);
额外安全建议
- 对会话中的
user_id做二次校验,比如查询数据库确认该用户ID真实存在,防止伪造会话 - 禁止直接通过URL暴露服务器文件路径,建议通过PHP接口输出图片,同时校验访问权限
- 上传图片时对文件名做随机重命名,避免文件名泄露敏感信息
内容的提问来源于stack exchange,提问作者jonathan22345
相关产品推荐
相关产品推荐

