市级档案网站建设情况分析,爱有声小说网站捡个校花做老婆,淮安软件园有做网站的吗,西安官网设计公司OTP本意是一次性口令#xff0c;比如邮箱验证码#xff0c;短信验证码#xff0c;或者根据totp或者hotp生成的默认30秒一变的6位数字。 不过开发者要注意#xff0c;必须要在验证成功后失效那个验证码#xff0c;不然就会导致重放攻击。 对于邮箱验证码#xff0c;服务器…OTP本意是一次性口令比如邮箱验证码短信验证码或者根据totp或者hotp生成的默认30秒一变的6位数字。 不过开发者要注意必须要在验证成功后失效那个验证码不然就会导致重放攻击。 对于邮箱验证码服务器可将邮箱和验证码存入json数组中或redis中验证时查找匹配成功则删除该项一般还应配置失效时间。 对于手机验证码服务器要将手机号和验证码存入json数组中或redis中验证时查找匹配成功则删除该项一般还应配置失效时间。 对于动态口令则要采用另外的方式 先准备一个历史成功json数组每项是一条json包含用户idtoken验证时刻禁止重复的时长 每验证成功一条用户和动态口令则查数据是否有相同id相同token并且验证时间还在禁止时间段内如果查到则认定为重放攻击记录日志验证不通过 如果没有查到那么如果该用户历史列表为空则添加json记录否则更新替换记录的token和验证时刻禁止重复时长。 注意一般动态口令验证会有一个允许的窗口数以平衡用户时间和服务器时间的差异这些前后窗口内的token值在当前验证仍然是可以通过的所以禁止重复时长至少要覆盖之后的窗口时长。如果token时长是30秒窗口是2那么禁止重复时长应该设置为90秒。 如果用户数量大嫌内存空间占用多可以考虑每次计算时删除已经过期的条目或者使用redis在添加记录时定义失效时间。
...
var loginfaillist[];
var userotpsucclist[];
...if (tokenValidates) {let histmatchuserotpsucclist.find(item((item.useridmatchuser.uid.toLowerCase())(item.tokenobj.token)(item.invalidnow)))if (histmatch!undefined) {addfail(now,clientip);logger.error(涉嫌重放攻击 matchuser.uid);return res.json({ msg:涉嫌重放攻击});}histmatchuserotpsucclist.find(item(item.useridmatchuser.uid.toLowerCase()))if (histmatchundefined) userotpsucclist.push({userid:matchuser.uid.toLowerCase(),token:obj.token,invalid:now200000})else { histmatch.tokenobj.token; histmatch.invalidnow200000; }loginfaillistloginfaillist.filter(itm(itm.ip!req.ip));logger.info(认证通过 matchuser.username clientip);res.json({msg:succ,userid:matchuser.uid.toLowerCase(),username:matchuser.username});}