预校验结果返回页面

上一篇我们实现了可以预校验用户名是否重名的功能,现在我们实现可以将结果返回到页面中去

测试:

完善用户注册

  1. 当用户名预检验重复时,我们应该不让用户可以点击注册按钮

    • js三大组成部分

在这之前我们要先了解js的三大组成部分
https://blog.csdn.net/qq_29134495/article/details/51993825

其中js中的DOM 中的鼠标事件中的提交事件,我们在register.html中加一个提交事件的监听器:

<form method="post" enctype="multipart/form-data" action="{% url 'peiqi1:register' %}" onsubmit="return check()">  {# 监听器返回布尔值,True就是允许提交,这里还要自己编写一个check函数 #}

我们在js文件中编写函数:

  $(function () {

    var $username = $('#username_input');

    $username.change(function () {
        var username = $username.val().trim();

        /* 判断内容框是否为空,空的就不发送给服务器验证 */
        if (username.length) {
            // 将用户名发送给服务器预校验
            $.getJSON('/peiqi1/checkuser/', {'username': username}, function (data) {
                console.log(data); /* 打印返回的结果 */

                var $username_info = $('#username_info');

                if (data['status'] === 200) { /*如果状态码位200*/
                    $username_info.html('用户名可用').css('color', 'green');
                } else if (data['status'] === 901) { /*如果状态码为901*/
                    $username_info.html('用户已存在').css('color', 'red');
                }
            })
        }
    })
})
  1. 我们还要限制,当用户名为空时,禁止可以点击提交按钮

     function check() {
         var $username = $('#username_input');
    
         var username = $username.val().trim();
    
         if (!username){
             /*如果没有数据,就返回false不能注册*/
         }
    
         /* 判断返回的字的颜色,如果是红色的就返回false,为绿的就返回true */
         var info_color = $('username_info').css('color'); /*返回字体颜色*/
    
         console.log(info_color);
    
         if (info_color == 'rgb(255,0,0)'){ /*如果返回返回的rgb为255,0,0,那么就返回false */
             return false
         }
         return true
     }
    })

    像邮箱验证,密码与确认密码一致性实现原理也是类似。

加密用户密码

我们打开用户名和密码所在的数据库:

我们可以看到,其密码是明文的,而服务器的人也不应该看到用户的密码,密码只应该是用户自己知道。

我们使用摘要算法来加密用户的密码。

另外补充一句,我们不要把所有函数都放在同一个文件中,不然这个文件到最后就会原来越大,成文上帝文件或者上帝类。

我们新建一个views_helper.py来存放加密的函数。

import hashlib

def hash_str(source):
    return hashlib.new('sha512', source.encode('utf-8')).hexdigest()

views:

def register(request):
    if request.method == 'GET':
        data = {
            'title': '注册'
        }
        return render(request, 'user/register.html', context=data)

    elif request.method == 'POST':

        username = request.POST.get('username')
        email = request.POST.get('email')
        password = request.POST.get('password')
        icon = request.FILES.get('icon')

        password = hash_str(password)  # 进行哈希加密

        user = peiqi1user()
        user.u_usename = username
        user.u_password = password
        user.u_email = email
        user.u_icon = icon

        user.save()

        # 注册成功之后重定向到登录界面
        return redirect(reverse('peiqi1:login'))

登陆时我们也可以使用上述的方法实现对密码的加密,限制密码的长度我们也可以在onsubmit中去限制。

测试:

当然也有更高端的算法,每次的密码加密出来的结果都是不一样。比如前一段是真正的哈希码,再在后面加一段时间戳,解密的时候先把时间戳去了,再去解密,而且hash+时间戳之后,在使用bash64加密一遍,这样别人就比较难破解。

Django中就自带了一个加密函数make_password(),我们可以使用继承了Django的shell来测试加密功能。

我们可以看到相同的123每一次加密出来的结果都不一样。

我们使用check_password可以验证密码:

>>> from django.contrib.auth.hashers import check_password
>>> check_password('123','pbkdf2_sha256$36000$eTHmyowraL13$ZKSWNGQAFND1DExTj/PE4R4porVao/Q2oJlt5W+lNQY=')
True
>>> check_password('123','pbkdf2_sha256$36000$tz0oYYjzAkIx$YjAvLb4DC1IvSml54MT4DusGLVeRXettRf0iXU4VCDU=')
True

高级密码安全工具

编码策略

  • 不在使用单一的算法实现

    • 至少使用两种以上的算法
    • 算法中融入时间散列
  • 将输入数据进行哈希处理
  • 哈希处理之后拼接时间戳

    • 中间使用特定拼接符号
  • 将拼好的数据进行编码
  • 验证策列

    验证策略

  • 将输入进行哈希算法
  • 将数据库中的密码进行解码处理
  • 取出时间散列混淆
  • 比较哈希码

可以多重复几次哈希,想要恶心别人就先要恶心自己,这样别人想破解的时候就会被恶心到。
银行进行9层哈希策略,一个简单的md5破解需要3-4天,中间还有特殊字符就需要花费1个月时间,那么9层就是9个月,那么在密码中再加入时间戳,并且有效时间是5分钟,那么就算9个月之后破解出来也就没有意义,并且还会加入RSA。

最后修改:2024 年 03 月 13 日
如果觉得我的文章对你有用,请随意赞赏