• API安全


    API示意图

    API安全示意图

    一、API安全的目标(CIA)

    机密性(Confientiality):确保信息只被预期的读者访问

    完整性(Integrity):防止未授权的创建,修改和删除

    可用性(Availability):当用户需要访问API时,API总是可用的

    二、常见的API风险(STRIDE)

    欺骗(Spoofing):伪装成某人

    干预(Tampering):将不希望被修改的数据、消息或设置改掉

    否认(Repudiation):拒绝承认做过的事

    信息泄露(Information disclosure):将你希望保密的信息披露出来

    拒绝服务(Denial of service):阻止用户访问信息和服务

    越权(Elevation ofprivilege):做了你不希望他能做的事

    三、风险与安全机制的对应关系

    认证=>欺骗:确保你的用户或客户端真的是他(它)们自己

    授权=>信息泄漏/干预/越权:确保每个针对API的访问都是经过授权的

    审计=>否认:确保所有的操作都被记录,以便追溯和监控

    流控=>拒绝服务:防止用户请求淹没你的API

    加密=>信息泄漏:确保出入API的数据是私密的

    四、攻击

    OWASP:开放网络应用程序安全项目

    OWASP十大漏洞:有助于保护代码免受软件安全漏洞的影响

    注入攻击:跨站脚本攻击(XSS)、SQL 注入攻击、头部注入攻击、日志注入攻击和全路径暴露

    SQL注入攻击防护:入参校验、控制数据库用户权限、使用数据库操作框架(Spring Data Jpa、Mybatis)

    五、API安全机制

    1、流控

    流控方式分别有单机限流和集群限流,限流实现见限流实现详解

    1)为什么需要流控

    • 保障系统可用性
    • 不被大流量访问压垮

    2)为什么流控排在认证、审计和授权前面

    越早把一些请求(指非正常请求)拒绝掉,资源浪费越少,越能处理更多请求 

    2、认证(初步了解)

    登录与认证的区别:登录(一次请求)、认证(每次请求)

    HttpBasic认证(不够安全) 

    3、数据校验

    接口层面:注解(@NotNull、@NotEmpty、@NotBlank等)

    数据库层面:字段设置非空

    为什么有接口层面校验还需要进行数据库层面校验

    因为业务逻辑处理可能出现空值

    4、数据加密

    • MD5加密摘要信息一样,不太安全,一般会有加盐(随机盐值)操作
    • 密文能够解析成明文的=>不安全
    • 数据校验应该判断加密后的密文是否一致而不是解析成明文进行比较

    5、HTTPS访问

    • HTTPS协议可以确保访问的网站是想访问的
    • HTTPS协议可以防止黑客篡改交换机使访问顶到其他网站
    • HTTPS协议可以保证数据传输安全(加密传输)
    • 申请HTTPS证书可以使HTTP网址变成HTTPS网址,自签证书也可以实现但不合规 

     6、审计

    授权之前:被授权拒绝的请求响应可以被记录下来

    认证之后:才能知道请求是谁发出来的

    日志:持久化

    实现日志记录:

    • 继承Filter(Filter):实现认证
    • 继承HandlerInterceptorAdapter(Interceptor):在请求前与请求后分别记录日志
    • 继承WebmvcConfigurer:使自定义Interceptor生效
    • 异常处理(ControllerAdvice):Spring异常处理是先返回成功再跳转异常,如果不自定义异常处理,日志会分别存储200(返回成功)和500(跳转异常)两条记录,所以自定义异常处理类(ErrorHandle类)使系统发生异常时走自定义异常处理,日志存储500(系统异常)一条数据

    7、授权

    访问控制:

    • ACL(Access Control Lists):简单易用,实现容易。无法满足复杂的业务需求,不易管理(Linux是典型的ACL例子,给不同用户赋予读写执行权限)
    • RBAC(Role Based Access Control):引入角色概念,简化管理。开发起来相对于ACL复杂

    8、登录

    Filter过滤器实现简单登录存在的问题:

    • Token存储在客户端不安全
    • 每一次请求都需要输入用户名密码
    • 加解密算法验证密码既耗时间又耗资源

    1)保持登录的方法

    2)常见的登录攻击及防护

    1. //请求不存在session则返回空
    2. HttpSession session = request.getSession(false);
    3. if(session != null) {
    4. //使session失效防止用户使用黑客的session cookie进行登录
    5. session.invalidate();
    6. }
    7. //生成新的session
    8. request.getSession(true).setAttribute("user", user);
  • 相关阅读:
    java计算机毕业设计疫情期间高校师生外出请假管理系统录屏源程序+mysql+系统+lw文档+远程调试
    Java基础接口
    Flask API 如何接入 i18n 实现国际化多语言
    两步将 CentOS 6.0 原地升级并迁移至 RHEL 7.9
    LENOVO联想笔记本小新 Pro-14 2021AMD处理器ACH版(82MS)原厂Win10系统
    【论文笔记】基于视觉特征提取的强化学习自动驾驶系统
    【centso】sqlite3.7.17升级到更新的版本
    猿创征文|我Java开发那些年陪我成长的工具清单
    echarts 轴文字内容太长导致显示不全解决方案
    IntelliJ IDEA 打开近期工作的项目的对话框的快捷键
  • 原文地址:https://blog.csdn.net/qq_39581637/article/details/125515127