关于使用邮箱作为登录验证机制的想法
在写chat的后台时,我放弃了使用密码登录的想法,这样的安全性是很低的,虽然开发速度快,但如果出现问题,后果也是很严重的,如果这次的接口能够写好,以后服务器上的程序也都可以
使用这种机制来进行登录验证,现在的想法和注意是:
- 请求的验证码必须设置次数,以及频率,每次请求的间隔为一个小时,这个间隔是指未登录成功的间隔,如果登录了就不算,可以随时登录
- 封锁的一个小时内,如果被恶意攻击封锁了,如何保证正常的登录不受影响,先暂时对IP地址进行封锁,不影响其他IP地址的登录实现。
- 登录code设置为8位的无规则组合密码,然后存入session中
- 输入的验证码只验证一次,如果错误则封锁IP一小时。
- 在没有请求验证码时是不能进行验证的,也就是直接判断session是否设置了,在验证完了以后,session也要及时删掉
- 设计专门的数据表来存储信息
- 先将信息存储在session中
- 判断验证码时应该只判断一次,如果错误,就进行封锁
- 添加校验码作为判断的第一道,防止恶性邮件请求
> 使用前的注意:必须有Email发送模块,ajax请求功能也得实现,代码是用PHP实现的,其他语言也是类似
Controller文件里的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
public function send_email_code(){ /** 为了防止恶意请求,设置校验码进行第一道过滤 */ $p_code = request('get','str','p_code',0); if ($p_code=='641351484'){ /** 先对有没有请求发送邮件进行判断 */ if (!session('?email')){ $email['code'] = rand(1000,9999); $email['ip'] = ip_select($_SERVER['REMOTE_ADDR']); $email['time'] = time(); $email['state'] = 1; // sendMail('nylrain@163.com','聊天室后台登录验证码','请求发起的IP地址:'.$email['ip'].' 验证码:'.$email['code']); session('email',$email); echo '1'; /** 验证码已经发送 */ }else{ $email = session('email'); $now_time = time()-$email['time']; /** 判断请求时间是否超过一个小时*/ if ($now_time>=3600){ session('email',null); $this->send_email_code(); }else{ echo '2';/** 验证码已发送,请勿重复请求 */ } } }else{ echo '3'; /** 校验码错误 */ } } public function validate(){ $code = request('get','int','code',0); if (!session('?email')){ echo '4';/** 请先发送验证码 */ }else{ $email = session('email'); if ($email['state']==1){ if ($code==$email['code']){ $admin['time'] = date('Y-m-d'); $admin['ip'] = $email['ip']; session('email',null); session('admin',$admin); echo '1';/** 验证成功 */ }else{ session('email.state',0); echo '2';/** 验证失败 */ } }else{ echo '3';/** 您的验证次数过多已被封锁 */ } } } /** * 登出操作 */ public function logout() { // Session::set(); session('admin', null); $this->redirect('/admin.php?c=index'); exit(); // $this->get_session(); } |
HTML文件中的显示和验证
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
<div class="tpl-login"> <div class="tpl-login-content"> <!--<div class="tpl-login-logo">--> <!--</div>--> <label style="color: #00FF00" id="state"> </label> <form class="am-form tpl-form-line-form"> <div class="am-form-group"> <input type="text" value="" name="p_code" id="p_code" class="tpl-form-input" id="user-email" placeholder="请输入校验码"> </div> <div class="am-form-group"> <input type="text" value="" name="code" id="code" class="tpl-form-input" id="user-name" placeholder="请输入邮箱验证码"> </div> <!--<div class="am-form-group">--> <!--<input type="password" class="tpl-form-input" id="user-name" placeholder="请输入密码">--> <!--</div>--> <div class="am-form-group tpl-login-remember-me"> <!--<input id="remember-me" type="checkbox">--> <label for="remember-me" onclick="send_email_code()">发送邮箱验证码</label> </div> <div class="am-form-group"> <button type="button" onclick="validate()" class="am-btn am-btn-primary am-btn-block tpl-btn-bg-color-success tpl-login-btn">提交</button> </div> </form> </div> </div> <script> function send_email_code(){ p_code = document.getElementById('p_code').value; $.getJSON("/admin.php?c=login&a=send_email_code&p_code="+p_code,function(data){ if (data==1){ document.getElementById("state").innerHTML = '验证码已经发送'; }else if (data==2){ document.getElementById("state").innerHTML = '验证码已发送,请勿重复请求'; }else if (data==3){ document.getElementById("state").innerHTML = '校验码错误'; }else{ document.getElementById("state").innerHTML = ''; } }); } function validate(){ code = document.getElementById('code').value; $.getJSON("/admin.php?c=login&a=validate&code="+code,function(data){ if (data==1){ location.href = '/admin.php?c=index'; }else if (data==2){ document.getElementById("state").innerHTML = '验证失败'; }else if (data==4){ document.getElementById("state").innerHTML = '请先发送验证码'; }else{ document.getElementById("state").innerHTML = '您的验证次数过多已被封锁'; } }); } </script> |