有网络的地方,就会有攻击,作为程序员,你可能没有遭遇过网络攻击,但肯定也多多少少听过或了解过网络攻击,像比较常见的 XSS跨站脚本攻击,DDos,SQL注入,DNS劫持等等。今天我们要讲的则是【重放攻击】,听到这个名词大家可能还不是很理解,那就接着往下看吧!


一、什么是重放攻击?

重放攻击是指黑客通过抓包的方式,得到客户端的请求数据及请求连接,重复的向服务器发送请求的行为。 比如你的系统中有一个 “购买” 的行为,当用户下单,点击购买按钮向服务器发送请求时,黑客对用户发起的请求进行了抓包,得到了传输数据。 因为用户填写的都是真实有效的数据,是可以购买成功的,因此黑客不用做任何改变,直接把抓取到的数据再往服务器提交一次就行了。


这就导致了,用户可能只是购买一个产品的,结果黑客重放攻击,客户就购买了多次。此时客户肯定就会莫名奇妙:怎么购买了那么多同样的产品,我只买了一个啊? 所以,重放攻击的危害还是挺大的,特别是涉及到金钱交易时,因此防重放攻击在很多项目中是必不可少的。


二、该如何御防?

解决方案:时间戳(timestamp) + 数字签名(sign), 也就是说每次发送请求时多传两个参数,分别为 timestamp 和 sign。


数字签名的作用是为了确保请求的有效性。因为签名是经过加密的,只有客户端和服务器知道加密方式及密钥(key),所以第三方模拟不了。我们通过对 sign 的验证来判断请求的有效性,如果 sign 验证失败则判定为无效的请求,反之有效。 但是数字签名并不能阻止重放攻击,因为黑客可以抓取你的 timestamp 和 sign不需做任何修改,然后发送请求。那么这个时候就要对时间戳进行验证了!


时间戳的作用是为了确保请求的时效性。我们将上一次请求的时间戳进行存储,在下一次请求时,将两次时间戳进行比对。如果此次请求的时间戳和上次的相同或小于上一次的时间戳,则判定此请求为过时请求,无效。因为正常情况下,第二次请求的时间肯定是比上一次的时间大的,不可能相等或小于。


有人会问,我直接用时间戳不就行了,为什么还要数字签名?因为黑客可能对请求进行抓包,然后修改时间戳为有效的时间戳值。我们的数字签名采用 timestamp + key 进行组合加密(timestamp 被修改了,加密后的sign 肯定验证就通不过),因此即使黑客修改了 timestamp ,但是由于黑客不知道 key,所以 sign 验证这步就成功的阻止了黑客的请求。

本文最后更新于 2023-10-30 10:07:20程序闲谈
作者:鄢云峰 YYF声明:转载请注明文章出处地址:https://www.yanyunfeng.com/article/9
评论
提交
来发第一个评论啦~