Django Нужно ли предпринимать какие-либо шаги для защиты пароля пользователя?
Я установил систему сброса пароля на своем сайте django. Сначала пользователь должен указать свой адрес электронной почты, затем мой сайт отправляет код восстановления пароля на его электронную почту. Пользователь должен ввести проверочный код и новый пароль на странице сброса пароля. Если он ввел правильный проверочный код, то его пароль будет изменен и перенаправлен на страницу сброса пароля. У меня есть несколько вопросов:
- is there any security risk in my password reset system?
- How
.set_password()
working for save user password? does it using any encryption method? - Most important question: can user change his user_id during changing password? if yes then how to stop him to change password password if user_id changed?
вот мой код:
первая функция отправки проверочного кода на электронную почту пользователя:
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')
Да. Система Django довольно безопасна при правильном использовании.
Если вы планируете делать некоторые настройки, вам действительно нужно знать, что вы делаете.
Вот документы от Django: