IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 越权漏洞风险及解决方案 -> 正文阅读

[网络协议]越权漏洞风险及解决方案

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);
    }

?

?

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-03-24 00:56:55  更:2022-03-24 00:57:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:44:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码