PHP开发如何阻止用户访问编辑其他注册用户的个人资料信息
当前实现存在的核心问题
- 鉴权逻辑仅校验了用户登录状态,没有校验当前登录用户和请求访问的用户资料是否匹配
- 将用户身份标识放在URL参数中,可被用户随意篡改,没有做服务端二次校验
最优解决方案(推荐)
直接移除个人资料页URL中的username参数,完全依赖服务端$_SESSION中存储的登录用户信息查询对应的资料,从根源上避免参数篡改的问题。
你跳转个人资料的代码可以简化为:
echo '<td><a href="profile.php">'.$_SESSION['loggedin'].' </a></td>';
profile.php中获取用户信息的逻辑直接读session即可,不需要处理GET参数:
session_start(); // 原有登录校验逻辑不变 if (!isset($_SESSION['username'])) { header('Location: admin/index.php'); exit; } // 直接从session取当前登录用户的用户名查询资料 $currentUsername = $_SESSION['loggedin']; // 后续基于$currentUsername查询数据库返回对应资料即可
兼容保留URL参数的方案
如果业务场景需要保留URL中的username参数(比如需要支持管理员查看任意用户资料),可以在原有鉴权逻辑后新增身份匹配校验:
session_start(); // 原有登录校验逻辑不变 if (!isset($_SESSION['username'])) { header('Location: admin/index.php'); exit; } $requestUsername = trim($_GET['username'] ?? ''); $currentUsername = $_SESSION['loggedin'] ?? ''; $isAdmin = $_SESSION['is_admin'] ?? false; // 有管理员需求可加这个字段,没有可以去掉 // 普通用户只能访问自己的资料 if (!$isAdmin && $requestUsername !== $currentUsername) { // 可以选择跳转到用户自己的资料页,或者返回403禁止访问 http_response_code(403); exit('无权访问其他用户的资料'); }
额外安全注意事项
- 所有用户身份判断都必须以服务端
$_SESSION存储的信息为准,永远不要信任前端传递的用户身份参数 - 修改资料、删除账号等敏感操作的接口,也要做同样的身份校验,避免绕过页面直接调用接口篡改信息
- 不要在
$_SESSION中存储过于敏感的信息,仅存储用户ID、用户名、权限位这类必要的身份凭证即可
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

