关于使用邮箱作为登录验证机制的想法

algorain

关于使用邮箱作为登录验证机制的想法

在写chat的后台时,我放弃了使用密码登录的想法,这样的安全性是很低的,虽然开发速度快,但如果出现问题,后果也是很严重的,如果这次的接口能够写好,以后服务器上的程序也都可以

使用这种机制来进行登录验证,现在的想法和注意是:

  1. 请求的验证码必须设置次数,以及频率,每次请求的间隔为一个小时,这个间隔是指未登录成功的间隔,如果登录了就不算,可以随时登录
  2. 封锁的一个小时内,如果被恶意攻击封锁了,如何保证正常的登录不受影响,先暂时对IP地址进行封锁,不影响其他IP地址的登录实现。
  3. 登录code设置为8位的无规则组合密码,然后存入session中
  4. 输入的验证码只验证一次,如果错误则封锁IP一小时。
  5. 在没有请求验证码时是不能进行验证的,也就是直接判断session是否设置了,在验证完了以后,session也要及时删掉
  6. 设计专门的数据表来存储信息
  7. 先将信息存储在session中
  8. 判断验证码时应该只判断一次,如果错误,就进行封锁
  9. 添加校验码作为判断的第一道,防止恶性邮件请求

> 使用前的注意:必须有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
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
<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>
  • Title: 关于使用邮箱作为登录验证机制的想法
  • Author: algorain
  • Created at: 2017-12-18 14:34:05
  • Updated at: 2023-05-14 21:39:50
  • Link: http://www.rain1024.com/2017/12/18/article108/
  • License: This work is licensed under CC BY-NC-SA 4.0.
 Comments