问题
设计接口的时候,针对于安全性,需要考虑几个问题。
第一个,请求调用方是否合法,攻击者冒充合法用户或者应用程序访问api。
第二个,请求会不会被篡改,是不是被第三方劫持了并且篡改了参数(中间人攻击);
第三个,是否有重复请求,我这个接口要能防重刷。
第四个,就是接口的敏感数据会不会被盗窃。
策略
0.控制api的访问边界
哪些接口是暴露给外部直接调用的,哪些接口是需要鉴权才能访问。
暴露给外部调用的接口就要考虑流量控制,避免被刷。
需要鉴权的接口就要做好认证和授权。
1.身份认证(关注你能不能访问)
- 使用安全的身份验证机制,如OAuth 2.0、API密钥、JWT等
- 登陆的时候用一些强密码策略,尝试登陆超过多少次就锁定账户等策略
2.授权(关注你能访问哪些资源)
- 按需提供,仅对用户或者应用程序开放必须的权限。
- 采用token授权,确保有效期和刷新机制。
3.数据不被篡改
- 采用https协议保证数据的完整性和安全性
- 采用参数签名,sign=MD5(key1=value&key2=value×tamp=123456&nonce=sssss&secret=kkksdf)
4.防重放(我获取到接口信息之后什么都不改,直接去重复请求)
签名中加入仅一次有效的随机字符串nonce和timestamps。
具体做法就是,服务端收到请求后,先校验签名是否正确,之后再看当前时间-timestamp是不是在有效期内,如果在有效期内,检查nonce在redis中是否存在,如果存在,则是重复请求。如果不是,就把它nonce存到redis里,有效时间设置为timestamp相同的有效时间。
5.流量控制
通过令牌桶,漏桶算法等策略,限制api的访问频率。
6.安全审计和日志:
建议实时监控API的使用情况,并记录详细的请求和响应信息。
定期对代码和依赖库做安全扫描。
7.api版本控制和向后兼容性
确保新版本的api不破坏现有功能。
8.黑名单机制和白名单机制
白名单:网关配置哪些ip可以访问接口
黑名单:禁止哪些ip访问啊(spring cloud gateway ,redis 布隆过滤器)