API接口开发 —— 防重放攻击、幂等性校验
防重放攻击
重放攻击是指重复发送客户端的请求,如果服务器没有做相应的处理,会导致服务器重复处理相同逻辑的现象。
产生重放攻击的原因可能是黑客的蓄意破坏,也可能是客户端本身的漏洞。例如网页上的按钮如果没有特殊处理,用户很有可能多次点击,导致客户端多次发送相同请求。
如何在设计上防止重放攻击呢?要解决这个问题,可以从多个角度着手。例如,客户端可以在用户点击按钮后,将按钮禁用来防止重复请求。
下面讨论几种后台可以采用的机制。
Level 1
时间戳
每次请求携带时间戳,服务端收到时间戳后,计算与当前时间的差值,如果超过60s则认为当前请求不合法。
随机值
客户端每次请求时生成一个随机值,服务端缓存60s内的随机值,如果随机值重复则不合法。
Level 2
上面的两种方法都可以过滤客户端短时间内的重复请求,但无法阻止黑客的蓄意攻击。黑客可以自己生成或篡改时间戳或随机值,因此我们要上加密。
时间戳+MD5
客户端和服务端先约定好密钥,如12345。每次请求在携带时间戳的同时,携带 MD5(时间戳+密钥),即使黑客篡改时间戳,由于没有密钥,也无法计算出新的MD5值。
Level 3
上面的方法可以防止黑客的攻击,但没法避免60s内的重复请求,我们可以在它的基础上增加随机值。
时间戳+MD5+随机值
每次请求携带时间戳、MD5,同时携带随机值,服务器缓存60s内的随机值。
收到请求后,1. 首先验证MD5是否正确 2. 验证时间戳是否在60s内 3. 验证随机值是否重复。
幂等性校验
另一种思路是幂等性校验,即服务端重复执行相同的请求,与只执行一次请求的结果状态相同。
比如,在请求中添加随机值,当重复请求到达时,服务端要判断该随机值对应的请求是否执行成功。具体判断标准可以根据具体的业务逻辑来实现。
相关链接
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Robby!
评论

