越权漏洞风险及解决方案

本文介绍了Web应用中的三种主要越权类型:水平越权、垂直越权和数据越权,并提供了相应的解决方案。水平越权通过修改接口参数操作他人数据,解决方法是正确获取用户信息。垂直越权涉及用户访问未授权接口,可通过功能码鉴权防止。数据越权是特定的水平越权,可通过用户信息校验避免。此外,还讨论了签名机制确保接口安全以及数据脱敏以保护敏感信息。
摘要由CSDN通过智能技术生成

1、越权分类

常见越权有水平越权、垂直越权和数据越权。

1.1 水平越权

用于A访问接口通过修改接口的参数操作了用户B的数据。比如查询订单列表接口,通过传递别人的userId查询别人的订单列表。这种问题出现的原因是接口直接使用用户传递的参数做租户隔离,并没有拿用户的参数与登录信息做对比,或者没有取登录信息里的用户信息做业务逻辑。解决办法:用户信息userInfo从登录信息里取。

1.2 垂直越权

用户A访问了超管接口/没有权限的接口。解决办法:做功能码鉴权,也就是做权限限制。可以为每个接口定义一个功能码,可在常量类里定义。然后在接口上添加自定义注解,把功能码添进去。然后用AOP做切面,在切面里读取登录用户的权限,查询权利里的功能码,看用户是否有当前接口权限。

1.3 数据越权

可以理解为水平越权的特例,接口使用了数据ID做参数。比如一个订单详情查询接口,入参是订单号,而订单号往往有规律,用户A在自己的一个合法的订单号基础上+1,就可能得到别人的一个存在的订单号,然后调用订单详情查询接口。

解决办法:查询接口默认添加一个用户信息做参数,用当前用户的登录信息做参数。或者先查询出来数据,在内存里对比用户信息。

2、其他安全措施

2.1 签名

与三方系统对接,无法通过登录信息做鉴权的,可以设计签名,预防接口被随意调用。解决方法:给三方系统颁发一个appId、Secret(记录在自己系统里),要求调用方传递参数时带上appId,然后传递一个签名sign,sign可以设计为 md5(业务参数+Secret)。接收方根据appId查询出来对应的Secret,然后用同样的算法计算sign,对比一致即可放行。设计签名,攻击方无法修改业务参数,因为修改了业务参数,sign便不对了,只要调用方不泄露secret,它就是安全的。接收方做好幂等,业务也不会有问题。最多被重放请求(ddos),并且重放也可以通过参数里加时间戳来解决。

2.2 数据脱敏

所有鉴权问题搞定后,数据字段透出最好做到最小化,前端不需要的字段不透出,敏感字段要脱敏。

3、代码实例

    /**
     * 获取订单详情
     * @param orderNo
     * @return
     */
    @RequestMapping(value = "order/info",method = RequestMethod.POST)
    @FunctionAuth(FunctionConstants.QUERY_ORDER)
    public ResponseVo getOrder(@RequestParam("orderNo") String orderNo) {
        // 基础非空校验
        Assert.isTrue(!StringUtils.isEmpty(orderNo));

        // 登录校验,从登录信息里获取用户信息
        LogInUserInfo userInfo = LoginUtil.getUserInfo();

        OrderInfo order = OrderService.getOrder(orderNo);
        
        // 水平越权
        if (order != null && order.getUserId() != userInfo.getId()) {
            throw new BizException("非法订单查询");
        }

        // 脱敏处理
        order = SensitiveUtil.del(order);

        return new ResponseVo(order);
    }

  • 1
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

济南大飞哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值