Java基础之《接口安全—防止篡改和重放》

只要api接口放在公网上暴露,就会有被攻击的风险,所以需要做好接口安全

一、防止篡改
1、什么是篡改
接口篡改是指通过http抓包获取api接口的请求参数,然后篡改api参数的内容,重新发送api请求。比如发送短信验证码、增加积分等

2、如何实现请求接口防止篡改
1)采用https方式加密传输,通过抓包就获取不到请求参数,缺点是成本高
2)后台对接口参数进行签名验证,报文头增加sign字段

3、验证的步骤
1)服务端和客户端约定好加密规则
2)客户端按照约定对报文加密(或者签名),获得签名值sign1,将加密结果放入sign字段
3)服务端按照同样约定对报文加密(或者签名),获得签名值sign2
4)服务端比对sign1和sign2是否一致,不一致则不通过,非法请求

二、防止重放
1、什么是重放攻击
重放攻击是指通过http抓包获取api接口的请求参数,不篡改参数,重复发送请求

2、重放攻击的危害
1)针对插入数据库接口:重放攻击,会出现大量重复数据,甚至把数据库撑爆
2)针对查询接口:一般攻击慢查询接口,例如一个慢查询接口1s,只要黑客发起重放攻击,必然造成系统被拖垮,数据库查询阻塞死

3、如果防止重放攻击
1)报文头增加timestamp字段,验证时间

4、验证的步骤
1)客户端发起http请求时,添加timestamp参数,一起发给服务端
2)服务端接收http请求后,判断timestamp时间戳与当前时间是否超过60s(根据业务情况设置),如果超过了就提示签名过期

5、问题
一般从抓包到重放请求耗时远远超过了60s,但也有在60s之内重放攻击的可能性,解决办法是增加nonce随机数字段
增加一个验证步骤:
1)服务端收到请求后,先判断timestamp是否过期
2)然后将nonce放入redis中,如果redis返回已存在,则返回非法请求。redis存储时,设置key有效期为30分钟
 

猜你喜欢

转载自blog.csdn.net/csj50/article/details/111474380