DoraCMS后台登录添加验证码功能
近来在阿里云上看到很多针对后台的密码破解请求,基本上被阿里云盾拦截了,目前这种暴力破解量并不大,如果是大量,或者没有防护措施,
会对服务器造成一定影响,于是考虑加上登录验证码功能,在一定程度上缓解这种情况。
近来在阿里云上看到很多针对后台的密码破解请求,基本上被阿里云盾拦截了,目前这种暴力破解量并不大,如果是大量,或者没有防护措施,
会对服务器造成一定影响,于是考虑加上登录验证码功能,在一定程度上缓解这种情况。
DoraCMS是基于Node的应用,如何添加图片验证码呢,下面简要描述步骤:
1、登录页面添加验证码输入框:
<div class="form-group"> <div class="col-md-6" style="margin-left: 0;padding-left: 0;"> <input type="text" class="form-control" name="vnum" ng-model="logFormData.vnum" placeholder="请输入验证码" required> </div> <span> <img src="/admin/vnum?<%=Date.now()%>" /></span> </div>
这里在验证码图片后加入时间参数,保证每次页面刷新后,验证码跟着改变。
2、方法实现:
这里用到了一个中间件(randomWord),获取随机字符,randomWord.js
module.exports = RandomWord; function RandomWord(chars){ if(!(this instanceof RandomWord)){ return new RandomWord(chars); } this._chars = ""; if(chars){ this.add(chars); } } RandomWord.prototype = { add:function(chars){ this._chars += chars; return this; }, random:function(size){ var len = this._chars.length; if(len === 0){ throw new Error('no chars,please use add(chars)'); } var word = ""; for(var i=0;i<size;i++){ var cpo = parseInt(Math.random()*len); word += this._chars.charAt(cpo); } return word; } }
除此之外,我们需要将获取的随机字符转换为png,这里用到了一个插件 png-word ,地址:https://github.com/liangzeng/png-word
安装方法:
npm install png-word
实现:
var PW = require('png-word'); var RW = require('../util/randomWord'); var rw = RW('abcdefghijklmnopqrstuvwxyz1234567890'); var pngword = new PW(PW.GRAY); //管理员登录验证码 router.get('/vnum',function(req, res){ var word = rw.random(4); req.session.vnum = word; pngword.createReadStream(word).pipe(res); });
当然,在做登录校验时,也需要校验验证码:
var vnum = req.body.vnum; if(vnum != req.session.vnum){ res.end('验证码有误!'); }
查看效果:
很赞哦! ( 0
)