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)常见的登录攻击及防护
//请求不存在session则返回空
HttpSession session = request.getSession(false);
if(session != null) {
//使session失效防止用户使用黑客的session cookie进行登录
session.invalidate();
}
//生成新的session
request.getSession(true).setAttribute("user", user);
版权归原作者 z.haoui 所有, 如有侵权,请联系我们删除。