API安全漏洞防范指南
字数 2012 2025-08-22 22:47:30
API安全漏洞防范指南
前言
根据Fastly 2024年3月的调查报告,95%的企业在过去一年中遇到过API安全问题。本文基于OWASP API Security Top 10,结合金融行业业务特点和Java开发技术栈,详细介绍API面临的安全漏洞问题及防范措施。
1. 防范敏感信息泄漏
1.1 信息脱敏
应用场景:当API接口返回结果涉及敏感信息在客户端展示时,应采用脱敏处理。
需脱敏的敏感数据类型:
- 姓名
- 证件号
- 卡号
- 手机号
- 车牌号
脱敏方法:一般采用掩码方式
示例:
原始返回报文: {"name":"张三","idCard":"110101199003072345","mobile":"13812345678"}
掩码后返回报文: {"name":"张*","idCard":"110101********2345","mobile":"138****5678"}
1.2 信息加密
应用场景:无法脱敏的敏感数据需进行加密处理
加密方式:
- 字段级加密
- 全报文加密
- 传输通道SSL加密
推荐加密算法:
- 对称密码算法:SM4、AES
- 非对称密码算法:SM2、RSA
- 杂凑算法:SM3、SHA256
不推荐算法:DES、MD5、SHA1(已不安全)
2. 防范API权限问题
2.1 防范未授权访问
身份认证机制:
- AK/SK
- Token
- Cookie
- 数字签名
关键要求:
- 身份认证凭据需有超时失效机制(互联网系统一般不超过15分钟)
- 不能仅依据客户端发送的userid、name、role等简易身份标识判断用户身份
Shiro拦截器示例:
Map<String,String> filterChainDefinitionMap = new LinkedHashMap<String,String>();
// 允许匿名访问静态资源
filterChainDefinitionMap.put("/static/**", "anon");
// 配置退出过滤器
filterChainDefinitionMap.put("/logout", "logout");
// authc:所有url都必须认证通过才可以访问
filterChainDefinitionMap.put("/**", "authc");
// 访问未授权界面跳转到统一的错误页面
shiroFilterFactoryBean.setUnauthorizedUrl("/403");
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
2.2 防范垂直越权
Shiro授权拦截器类型:
- perms
- roles
- ssl
- rest
- port
示例:
// 必须是管理员角色可以访问
filterChainDefinitionMap.put("/admin/**", "roles[100001]");
2.3 防范水平越权
防范措施:
- 对访问数据做权限控制
- SQL语句带上userId进行操作
- 使用随机且不可预测的值作为请求参数
SQL示例:
select * from orders where order_id = #{orderId} and user_id = #{userId}
3. 防范高频恶意访问
3.1 防范资源浪费
典型场景:
- 短信发送接口
- 文件上传/下载接口
防范措施:
- 限制请求频率(如3次)
- 超过限制后需人机交互验证(图形验证码等)
恶意请求示例:
base_url="http://xxx/"
post_data="mobile=13812345678"
for i in range(10000):
requests.post(url=base_url+"/sendsms",data=post_data)
3.2 防范拒绝服务
防范措施:
- 对消耗CPU资源的接口限制请求频率
- 对消耗内存、磁盘和JVM Buffer的接口限制请求数据包大小和频率
恶意请求示例:
base_url="http://xxx/"
post_data="data="+"A"*1000000
for i in range(10000):
requests.post(url=base_url+"/submit",data=post_data)
4. 防范注入类安全漏洞
4.1 传入参数校验
校验内容:
- 类型
- 长度
- 格式
- 取值范围
- 特殊字符检查
需防范的漏洞类型:
- SQL注入
- 代码注入
- 反序列化命令执行
- SSRF
- URL跳转漏洞
4.2 返回数据校验
防范漏洞:
- XSS
- 点击劫持
- 敏感信息泄漏(如错误堆栈)
5. 防范重放攻击
5.1 时间戳校验
原理:正常HTTP请求响应时间一般在1s内完成,基本不超过10s
实施:服务端设置时间阈值,拒绝超过阈值的请求
5.2 随机因子或交易流水号校验
实施步骤:
- 客户端每次请求携带随机数或交易流水号
- 服务端校验是否存在
- 不存在则存储到数据库/缓存
- 存在则判定为重放攻击
6. 防范交易抵赖
6.1 数字签名实现原发性抗抵赖
实施方式:
- 客户端使用数字证书、Ukey等对交易报文签名
- 服务端通过验签实现抗抵赖
6.2 保存原发性证据
必须保存的信息:
- 交易流水号
- 相关账户号
- 交易终端标识
- 相关交易指令号
交易流水查询功能要求:
- 日期
- 时间
- 交易卡号
- 交易金额
- 资金余额
7. 防范业务逻辑漏洞
7.1 确保交易流程完整性
原则:
- 使用服务器端保存的、已合法性检查的数据完成交易
- 对客户端提交的交易数据实施合法性检查后再处理
- 多次交互中每次获取数据后都重新实施合法性检查
7.2 防范条件竞争漏洞
典型场景:
- 签到
- 领取积分
- 使用优惠券
Spring框架防范措施:
- 尽量使用局部变量而非共享变量
- 使用ThreadLocal存储和传递上下文信息
8. 避免调试接口暴露
禁止在互联网环境开放的接口:
- 测试类、调试类接口(如Swagger、api-docs)
- 监控类接口(如Spring Actuator)
总结
本文所述漏洞与OWASP API TOP 10 2023版对应关系如下:
| 本文内容 | OWASP API TOP 10对应项 |
|---|---|
| 敏感信息泄漏 | API1: Broken Object Level Authorization |
| API权限问题 | API1, API2, API5 |
| 高频恶意访问 | API4: Unrestricted Resource Consumption |
| 注入类漏洞 | API8: Injection |
| 重放攻击 | API9: Improper Assets Management |
| 交易抵赖 | - |
| 业务逻辑漏洞 | API10: Unsafe Consumption of APIs |
| 调试接口暴露 | API9: Improper Assets Management |