预校验结果返回页面
上一篇我们实现了可以预校验用户名是否重名的功能,现在我们实现可以将结果返回到页面中去
测试:
完善用户注册
当用户名预检验重复时,我们应该不让用户可以点击注册按钮
- 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');
}
})
}
})
})
我们还要限制,当用户名为空时,禁止可以点击提交按钮
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。
此处评论已关闭