防重放攻击

重放攻击是指重复发送客户端的请求,如果服务器没有做相应的处理,会导致服务器重复处理相同逻辑的现象。

产生重放攻击的原因可能是黑客的蓄意破坏,也可能是客户端本身的漏洞。例如网页上的按钮如果没有特殊处理,用户很有可能多次点击,导致客户端多次发送相同请求。

如何在设计上防止重放攻击呢?要解决这个问题,可以从多个角度着手。例如,客户端可以在用户点击按钮后,将按钮禁用来防止重复请求。

下面讨论几种后台可以采用的机制。

Level 1

时间戳

每次请求携带时间戳,服务端收到时间戳后,计算与当前时间的差值,如果超过60s则认为当前请求不合法。

随机值

客户端每次请求时生成一个随机值,服务端缓存60s内的随机值,如果随机值重复则不合法。

Level 2

上面的两种方法都可以过滤客户端短时间内的重复请求,但无法阻止黑客的蓄意攻击。黑客可以自己生成或篡改时间戳或随机值,因此我们要上加密。

时间戳+MD5

客户端和服务端先约定好密钥,如12345。每次请求在携带时间戳的同时,携带 MD5(时间戳+密钥),即使黑客篡改时间戳,由于没有密钥,也无法计算出新的MD5值。

Level 3

上面的方法可以防止黑客的攻击,但没法避免60s内的重复请求,我们可以在它的基础上增加随机值。

时间戳+MD5+随机值

每次请求携带时间戳、MD5,同时携带随机值,服务器缓存60s内的随机值。

收到请求后,1. 首先验证MD5是否正确 2. 验证时间戳是否在60s内 3. 验证随机值是否重复。

幂等性校验

另一种思路是幂等性校验,即服务端重复执行相同的请求,与只执行一次请求的结果状态相同。

比如,在请求中添加随机值,当重复请求到达时,服务端要判断该随机值对应的请求是否执行成功。具体判断标准可以根据具体的业务逻辑来实现。

相关链接