【发布时间】:2021-11-27 06:33:07
【问题描述】:
我在我的 django 网站上设置了密码重置系统。用户首先需要提交他的电子邮件地址,然后我的网站向他的电子邮件发送密码休息代码。他需要在密码重置页面输入他的验证码和新密码。如果他输入了正确的验证码,那么他的密码将被更改并重定向到登录页面。 我有几个问题:
- 我的密码重置系统是否存在安全风险?
-
.set_password()如何保存用户密码?它使用任何加密方法吗? - 最重要的问题:用户可以在更改密码期间更改他的user_id吗?如果是,那么如果 user_id 发生更改,如何阻止他更改密码密码?
这是我的代码:
第一个发送验证码到用户邮箱的函数:
def ForgetPasswordSendCode(request):
if request.method == "POST":
email = request.POST["email"]
User = get_user_model()
if not User.objects.filter(email=email).first():
messages.success(request, "Invalid mail")
return redirect('members:reset-password')
user_obj = User.objects.get(email=email)
reset_code = str(rand_number_mail())
profile_obj = UserProfile.objects.get(user=user_obj)
profile_obj.forget_password_token = reset_code
profile_obj.save()
current_site = get_current_site(request)
subject = 'Password Reset Code'
context = {
'user_first_name': user_obj.first_name ,
'user_last_name': user_obj.last_name ,
'domain': current_site.domain,
'reset_code': reset_code
}
html_body = render_to_string('mail/resetpassword-mail.html', context)
to_email = request.POST["email"]
email = EmailMultiAlternatives(subject=subject,from_email='noreply@farhyn.com',to=[to_email])
email.attach_alternative(html_body, "text/html")
email.send(fail_silently=False)
messages.success(request, "password reset code sent to your email address")
return redirect('members:change-password')
return render(request, 'members/password_reset_form.html')
第二个函数更改用户密码。用户需要输入验证码和新密码。
def ChangePassWordPage(request):
User = get_user_model()
try:
if request.method == "POST":
forget_password_token = request.POST["forget_password_token"]
password1 = request.POST["password1"]
password2 = request.POST["password2"]
if not UserProfile.objects.filter(forget_password_token=forget_password_token):
messages.warning(request, "Invalid Code. Enter the correct code without any space")
if password1 != password2:
messages.warning(request,"The two password fields didn’t match")
return redirect('members:change-password')
user_profile = UserProfile.objects.get(forget_password_token=forget_password_token)
user_id = user_profile.user_id
user_obj = User.objects.get(id=user_id)
if password1 == password2:
user_obj.set_password(password1)
user_obj.save()
reset_code = str(rand_number_mail())
user_profile.forget_password_token = reset_code
user_profile.save()
messages.success(request,"Your password sucessfully changed")
return redirect('members:login')
except Exception as e:
print('wrong user')
return render(request,'members/password_change.html')
【问题讨论】:
标签: python python-3.x django