You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Angular 5路由访问权限控制:当前实现是否存在绕过风险?

这个实现确实存在被用户绕过的风险!

哥们,你当前在组件ngOnInit()里做权限校验的方式,本质上是前端层面的校验,而前端代码完全暴露在用户的浏览器环境中,很容易被篡改或绕过,具体来说有这几个点:

  • 前端代码可直接篡改:用户可以通过浏览器开发者工具(比如Chrome的DevTools)修改组件的JavaScript代码——比如直接删掉权限校验的逻辑,或者把if (!permission)的判断改成if (true),这样就能直接跳过校验进入页面,甚至能看到组件渲染的内容(哪怕只是一瞬间)。
  • HTTP请求可被伪造/篡改:用户可以用抓包工具(比如Fiddler、Charles)拦截你发送的权限校验请求,把服务器返回的“无权限”响应改成“有权限”,这样组件就会认为校验通过,允许访问。
  • 路由跳转可被打断:就算校验不通过触发了Router.navigateByUrl,用户也能在开发者工具的控制台里阻止这个跳转行为,或者直接修改路由地址强制进入目标页面。
  • 缺少服务器端的终极校验:退一步说,就算用户绕过了前端的页面访问限制,如果你的后端接口没有对用户权限做二次校验,用户依然可以直接调用敏感接口获取数据——前端校验从来都只能做“体验优化”,不能作为安全屏障。

怎么改进才能降低风险?

给你几个实际的优化方向:

  1. 改用Angular路由守卫(CanActivate/CanActivateChild
    把权限校验逻辑移到路由守卫里,而不是组件的ngOnInit。路由守卫会在路由跳转之前就执行校验,不通过的话直接拦截跳转,连目标组件都不会加载,从根源上避免了组件内容泄露的可能。示例代码大概是这样:

    @Injectable({ providedIn: 'root' })
    export class AuthGuard implements CanActivate {
      constructor(private authService: AuthService, private router: Router) {}
    
      canActivate(route: ActivatedRouteSnapshot): Observable<boolean> {
        return this.authService.checkPermission(route.data.requiredPermission).pipe(
          map(hasPermission => {
            if (!hasPermission) {
              this.router.navigate(['/no-permission']);
              return false;
            }
            return true;
          })
        );
      }
    }
    

    然后在路由配置里绑定守卫:

    const routes: Routes = [
      { path: 'sensitive-page', component: SensitiveComponent, canActivate: [AuthGuard], data: { requiredPermission: 'view_sensitive' } }
    ];
    
  2. 强化服务器端权限校验
    所有敏感接口必须在服务器端校验用户的权限(比如从Token里解析用户身份,再查数据库判断是否有权限),不管前端有没有校验,后端都要自己做判断——这才是真正的安全防线。

  3. 前端权限状态的安全管理
    从服务器获取权限后,可以把权限信息存在内存里(而不是localStorage/sessionStorage,避免被篡改),路由守卫直接读取内存中的权限状态,减少重复请求的同时,也降低了被篡改的概率。如果需要持久化,记得对权限数据进行加密存储。

  4. 避免暴露敏感逻辑
    尽量把权限校验的逻辑封装在服务里,不要在组件里直接写直白的判断语句,虽然这不能完全阻止篡改,但至少增加了用户绕过的成本。

内容的提问来源于stack exchange,提问作者rahs

火山引擎 最新活动