面试官:什么是垂直越权?有哪些解决方案?

什么是垂直越权?

假如系统中有一个删除数据的接口,这个接口正常情况下只有管理员登录到管理台才能调用到这个接口,但是有一个用户小勇,一个调皮的程序员,他猜到了这个接口的URL,然后用postman直接调用了删除接口,哦吼,数据被删了,这就是垂直越权,本来用户没有权限,但是通过某种手段向上拿到了更高的权限。

这种场景出现的原因,一方面是小勇太聪明加胆子大,另外一方面是接口没有做权限验证,所以,开发时,我们不能假定该接口只会 被管理员调用,而应该做到该接口只能被管理员调用。

我给大家列三种解决方案,大家看看哪种方案最好。

接口级校验

第一个想到的思路就是在接口内做校验,判断当前请求的用户是不是管理员,如果不是,则拒绝请求,伪代码:

java 复制代码
@DeleteMapping
public Result delete() {
    User user = session.getUser();
    if (!user.isAdmin()) {
        return Result.error();
    }
    // 正常处理
    return Result.ok();
}

这样,不管小勇多么聪明,都不能调用成功了,除非他拿到了管理员的登陆cookie~,这种方案需要改造每个接口,工作量太大,业务同事不同意,说能不能在网关层面统一做校验呢?

网关级校验

作为网关,是所有请求的入口,它能知道:

  1. 当前请求调用的是哪个接口,请求url
  2. 当前请求的用户是谁

但是网关还需要解决:

  1. 得判断当前请求的用户是不是管理员,或者如果把权限控制做得更细,还需要获取当前用户有哪些权限,这得查数据库,有点影响网关的性能
  2. 另外如果小勇确实拿到了管理员的cookie,把自己伪装成了管理员,网关又该如何拦截呢?

接口签名

肯定还是在网关做,不过可以这么做。

前端页面在调用接口时,在请求头设置一个签名key,这个签名的内容包括接口url、页面url、uid、其他干扰数据,签名表示哪个人在哪个页面调用了哪个接口。

签名算法保密,除非小勇跟我们前端小姐姐比较熟,不然他是不知道签名内容格式和算法的。

网关拿到请求后,取请求头中的签名key,如果请求头中没有,则拒绝该请求,如果有,则按商量好的签名算法解签,如果解签失败,也拒绝该请求,解签成功,则比对签名内容,比如判断session中的uid是不是等于签名中的uid。

这样,对于小勇来说,就算他能猜到url,就算他能拿到cookie,他还得知道签名key的内容和算法,不然他发送的请求中没有签名请求头,网关会拒绝掉该请求,或者传一个错误的签名也会被拒绝。

总之,现在小勇想要胡乱调用我们的接口变得更难了。

不过大家注意,这个签名并不是万能的,比如小勇搞定了我们前端小姐姐,那该怎么办呢?

希望得到你的点赞和分享,我是大都督周瑜,我们下次见,我的公众号:IT周瑜。

相关推荐
Mahir085 小时前
Spring 循环依赖深度解密:从问题本质到三级缓存源码级解析
java·后端·spring·缓存·面试·循环依赖·三级缓存
绝知此事6 小时前
【算法突围 01】线性结构与哈希表:后端开发的收纳术
java·数据结构·算法·面试·jdk·散列表
IT_陈寒9 小时前
Redis缓存击穿把我整不会了,原来还有这手操作
前端·人工智能·后端
kyriewen9 小时前
面试官让我查各部门工资最高的员工,我用AI三秒写出窗口函数,他愣了
后端·mysql·面试
文心快码BaiduComate9 小时前
干货|Comate Harness Engineering工程实践指南
前端·后端·程序员
光辉GuangHui10 小时前
Agent Skill 也需要测试:如何搭建 Skill 评估框架
前端·后端·llm
我是谁的程序员10 小时前
Mac 上生成 AppStoreInfo.plist 文件,App Store 上架
后端·ios
irving同学4623810 小时前
Node 后端实战:JWT 认证与生产级错误处理
前端·后端
春天花会开13110 小时前
Kubernetes 高可用架构实战指南
架构
Master_Azur10 小时前
单元测试——Junit单元测试框架
后端