如何禁止用户直接修改URL路径参数访问无权限的他人账号页面
水平越权访问问题修复方案
这个问题属于典型的水平权限绕过漏洞,根源是系统没有对访问者的身份和请求资源的归属权做校验,需要前后端协同改造,仅靠单一端的防护无法彻底解决问题。
前端优化方案
- 优先修改路由设计:移除个人资料页URL中的用户ID参数,路由统一设置为
/my-account,当前登录用户的ID直接从登录态缓存(本地存储、全局状态管理器)中读取,从根源避免用户手动修改URL参数的可能。 - 路由守卫校验:如果业务场景必须保留URL带用户ID的设计,需要在路由拦截逻辑中增加校验规则:
拿Angular框架的CanActivate守卫举例,伪代码如下:
注意:前端校验仅能优化用户体验,无法作为安全防护的最终防线。canActivate(route: ActivatedRouteSnapshot): boolean { // 从本地登录态获取当前已登录用户的ID const currentUserId = localStorage.getItem('login_user_id'); // 从URL路径中读取携带的ID参数 const targetUserId = route.params['id']; // 二者不匹配时直接拦截,跳转到无权限页或当前用户的个人资料页 if (currentUserId !== targetUserId) { this.router.navigate(['/403']); return false; } return true; }
后端加固方案(必做,唯一可靠的防护手段)
- 所有涉及用户私有数据的查询、修改接口,禁止完全信任前端传递的用户ID参数。每次请求首先从身份凭证(Cookie、JWT Token)中解析出当前登录用户的真实ID,身份凭证过期或无效直接返回401错误。
- 查询、修改用户数据时,必须用解析出来的当前登录用户ID作为查询条件,比如查询用户资料的SQL需要写成:
其中SELECT * FROM user_info WHERE id = #{current_login_user_id} AND is_deleted = 0;current_login_user_id是后端从Token中解析的ID,不是前端传参。 - 如果接口必须接收前端传递的用户ID,要优先和解析出来的登录用户ID做比对,不一致直接返回
403 Forbidden错误。
额外安全建议
- 身份凭证设置HttpOnly、Secure、SameSite属性,避免被XSS、CSRF攻击窃取或冒用。
- 敏感接口增加请求频率限制,防止攻击者批量遍历爬取用户数据。
内容的提问来源于stack exchange,提问作者Tommy Gordon
相关产品推荐
相关产品推荐

