第一种方法:数据库
重放攻击是计算机世界黑客经常使用的攻击方式之一,所谓重放攻击就是攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,后端
主要用于身份认证过程。服务器
首先要明确一个事情,重放攻击是二次请求,黑客经过抓包获取到了请求的HTTP报文,而后黑客本身编写了一个相似的HTTP请求,ui
发送给服务器。也就是说服务器处理了两个请求,先处理了正常的HTTP请求,而后又处理了黑客发送的篡改过的HTTP请求。url
每次HTTP请求,都须要加上timestamp参数,而后把timestamp和其余参数一块儿进行数字签名。由于一次正常的HTTP请求,blog
从发出到达服务器通常都不会超过60s,因此服务器收到HTTP请求以后,首先判断时间戳参数与当前时间相比较,是否超过了60s,token
若是超过了则认为是非法的请求。接口
假如黑客经过抓包获得了咱们前台的请求url: md5
https://www.doadc.com/index/userInfo?uid=110&stime=1520862753&sign=80b886d71449cb33355d017893720666
其中 字符串
$sign=md5($uid.$token.$stime); // 服务器经过uid从数据库中可读出token
后端开始解析,通常状况下,黑客从抓包重放请求耗时远远超过了60s,因此此时请求中的stime参数已经失效了。
若是黑客修改stime参数为当前的时间戳,则sign参数对应的数字签名就会失效,由于黑客不知道token值,没有办法生成新的数字签名。
一、先判断stime 与当前服务器时间差值是否大于60s若是大于那么能够拒绝响应该请求
二、验证$sign 根据约定的规则判断后端生成的sign与前台传过来的sign是否一致
三、若是验证经过则根据uid查询用户信息
但这种方式的漏洞也是存在的,若是在60s以内进行重放攻击,那就没办法了,因此这种方式不能彻底保证请求仅一次有效。
第二种方法:
咱们在timestamp方案的基础上,加上随机字符串nonce参数,由于timstamp参数对于超过60s的请求,都认为非法请求,因此咱们只须要在
服务端存储60s的nonce参数的“集合”便可。
假如黑客经过抓包获得了咱们的请求url:
https://www.doadc.com/index/userInfo?uid=110&stime=1520862753&sign=80b886d71449cb33355d017893720666&nonce=HNJDHJNHHJ323
其中
$sign=md5($uid.$token.$stime.$nonce); // 服务器经过uid从数据库中可读出token
若是在60s内,重放该HTTP请求,由于nonce参数已经在首次请求的时候被记录在服务器的nonce参数“集合”中,因此会被判断为非法请求。
超过60s以后,stime参数就会失效,此时由于黑客不清楚token的值,因此没法从新生成签名。
综上,咱们认为一次正常的HTTP请求发送不会超过60s,在60s以内的重放攻击能够由nonce参数保证,超过60s的重放攻击能够由stime参数保证。
由于nonce参数只会在60s以内起做用,因此只须要保存60s以内的nonce参数便可。
咱们并不必定要每一个60s去清理该nonce参数的集合,只须要在新的nonce到来时,判断nonce集合最后一次修改时间,超过60s的话,
就清空该集合,存放新的nonce参数集合。其实nonce参数集合能够存放的时间更久一些,可是最少是60s。
随机数集合能够根据业务场景采用按期清理或根据大小自动清理的方案,例如该接口每秒的请求数最高为1000,则60s内的请求数量最多为1500*60=90000,
则咱们在每次请求后检查集合大小是否超过90000,若超高该数量则清空。