如何构建可独立验证的后端鉴权边界

2 人参与

深夜排查过鉴权故障的人都有这种体验:问题往往不出在显而易见的登录页,而是藏在某个接口的“信任链条”里。前端传了个参数,后端就信了;网关做了校验,服务层直接跳过;Cookie 里塞了个角色标记,数据库查询时压根没再对一遍。这些事单独看都像小疏忽,凑在一起就变成了边界上的裂缝。

鉴权不是一道门,而是一张网

很多人把鉴权想象成一道防盗门——通过了就万事大吉。实际上它更像一张网,每一个需要保护的后端资源都是一个网眼。问题在于,网眼的尺寸常常不一致。

见过一个典型案例:某后台系统的“编辑用户信息”接口,前端只在菜单栏判断了角色,管理员才能看到入口。但接口本身收到请求后,只校验了 Token 是否有效,没检查这个 Token 对应的用户到底有没有编辑权限。结果一个普通用户拿到自己的 Token 后,直接调接口改掉了其他人的手机号。前端藏得再干净也没用,攻击者根本不会走你的页面。

这就是“可独立验证”的核心所在——每一个后端接口,必须在不依赖前端传来的任何“提示信息”的前提下,仅凭请求本身携带的凭证(Token、Session 等)完成授权判断。前端传的 isAdmin=true 不能信,URL 参数里的 role=admin 也不能信。唯一能信的,是服务端根据凭证从可信存储(数据库、缓存、签名体)里查出来的身份和权限。

把“三要素”钉进代码里

要把这个边界做实,有个很笨但很管用的办法:把“谁、干什么、碰什么”这三件事写进每一处校验逻辑里。

  • :不是前端传的用户 ID,而是从签名过的 Token 或服务端 Session 里取出来的主体标识
  • 干什么:读、写、删除、导出——动作不同,风险等级不同,校验粒度也该不同
  • 碰什么:具体到哪条数据、哪个文件、哪个租户的资源

这三个要素凑齐了,授权判断才站得住脚。比如“用户 A(谁)要导出(干什么)租户 X 的订单报表(碰什么)”,后端需要验证:A 的 Token 是否有效、A 是否属于租户 X、A 是否有导出权限。三个条件都过了,才算数。缺一个,链条就断了。

别让缓存和跨域规则拆了你的台

还有个容易被忽视的角落:缓存和跨域策略。一个设置了 Access-Control-Allow-Origin: * 且允许携带凭证的接口,配合上浏览器缓存的 Authorization 头,基本等于把鉴权边界拱手让人。攻击者只要诱导用户访问一个恶意页面,就能以用户的身份发起跨域请求,后端还以为是正常调用。

排查这类问题时,有个简单的方法:把低权限账号、过期 Token、跨来源请求、共享链接这四个场景编成固定测试用例,每次发版跑一遍。别只测“正常流程能通”,要专门测“不该通的绝对不通”。只有这些边角样本也死死挡在外面,边界才算真正收紧了。

参与讨论

2 条评论
  • 幽篁独坐

    这边界概念我懂,但具体校验还是得自己盯着点。

    回复
  • 复活兔子

    别让缓存和跨域规则把边界给拆了,真的下头。

    回复