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

如何禁止用户直接修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 23:15:01