密码次数尝试,可以有效的保护用户账户安全,有了限制之后,就算用量子计算机都束手无策。
银行卡也是这种,尝试次数过多,就锁定,说不定还会自动报警。
<>强效果图强>
,
, <>强数据库表设计强>
在表里面添加一个字段,字符串类型。里面包含两个数据,密码失败尝试日期和次数如<代码> 2019 a10a23 | 10 代码>
这里我使用|做数据段分割,一个字母做日期分割
<强>代码逻辑强>
当记录的日期是当天,那么密码错误的时候,<代码>次数+ 1 代码>
当记录的日期不是当天,那么重置
这是我实现的简单代码封装
(这里只实现了一天内x次的简单校验,高级规则需要自己改)
/* * *尝试登录次数限制 * login_number[日期,次数]. join (“|”) *更新到数据库(更新数据)=比;{} *返回{ *运行bool真的:超过错误的:正常 *开始登录失败后修改状态 *} */出口。Login_n=(login_number,更新到数据库)=比;{ 让运行=true 让当日登录次数=0 让当日最多尝试次数=10 var getD=()=比;{ var=new日期() var d=[date.getUTCFullYear (), date.getMonth () + 1, date.getDate ()] . join (' a ') 返回维 } 如果(login_number) { 让日期=login_number.split (“|”) [0] 让n=login_number.split (“|”) [1] 如果(日期==getD ()) { 当日登录次数=(+ n) } } 如果当日登录次数祝辞=当日最多尝试次数){ 运行=false } 让登录失败后修改状态函数=()=比;{ 让add_login_number 让非当日=()=比;{ 更新到数据库([getD (), 0] . join (“|”)) } 让今天=(n)=比;{ 更新到数据库([getD (), n] . join (“|”)) } 如果(! login_number) { 非当日() 其他}{ 让日期=login_number.split (“|”) [0] 让n=login_number.split (“|”) [1] 如果(日期==getD ()) { 今天((+ n) + 1) } } } 返回{ 运行时, 开始:登录失败后修改状态函数 } }
引入,设置状态
var {Login_n}=要求(“。/Login_n”) var login_n=login_n (login_number (v)=比;{ db(“所有”、“更新t_user设置login_number=& # 63;id=& # 63;”, [v, id])。然后(结果=比;{ console.log(“修改登录失败次数记录成功”) }) })
拦截
如果(! login_n.run) { 解决({ 代码:1, 味精:“账户异常锁定,请明天再试” }) 返回 }
密码错误开始记录
如果结果[0]。pw !==pw) {//登录失败,更新登录次数 login_n.start () 解决({ 代码:1, 味精:“密码错误的 }) 返回 }
需要引入上面的(错误限制次数代码)
这里的md5,是为了双重加密,当内部员工拿到数据库密码后也不容易登录,依赖nodejs内置包<代码>加密代码>
var加密=要求(加密) 出口。phone_pw_login=(params,点播)=比;新的承诺((决心,拒绝)=比;{ var {Login_n}=要求(“。/Login_n”) 让{通过,电话}=参数 var md5=crypto.createHash (md5); 让pw=md5.update(通过).digest(十六进制).toUpperCase () db(“所有”、“选择电话、pw id、名称、login_number从t_user电话=& # 63;”,[电话])。然后(结果=比;{ 让{login_number, id}[0]=结果//账号不存在 如果结果。长度==0){ 解决({ 代码:1, 味精:“密码错误',//避免得知是否注册账号 }) 返回 }//次数校验 var login_n=login_n (login_number (v)=比;{ db(“所有”、“更新t_user设置login_number=& # 63;id=& # 63;”, [v, id])。然后(结果=比;{ console.log(“修改登录失败次数记录成功”) }) }) 如果(! login_n.run) { 解决({ 代码:1, 味精:“账户异常锁定,请明天再试” }) 返回 } 如果结果[0]。pw !==pw) {//登录失败,更新登录次数 login_n.start () 解决({ 代码:1, 味精:“密码错误的 }) 返回 } 让牌=Jwt。创建({电话:结果[0]。电话,id: id、pw}) 解决({ 代码:200, 味精:{ 名称:结果[0]. name, 电话:[0].phone结果, 令牌, } }) }) .catch(错误=比;{ console.log(错误) 解决({ 代码:1, 味精:“服务器错误的 }) }) })详解节点登录接口之密码错误限制次数(含代码)