【问题标题】:Django Do I need to take any step for secure my user password?Django 我需要采取任何措施来保护我的用户密码吗?
【发布时间】:2021-11-27 06:33:07
【问题描述】:

我在我的 django 网站上设置了密码重置系统。用户首先需要提交他的电子邮件地址,然后我的网站向他的电子邮件发送密码休息代码。他需要在密码重置页面输入他的验证码和新密码。如果他输入了正确的验证码,那么他的密码将被更改并重定向到登录页面。 我有几个问题:

  1. 我的密码重置系统是否存在安全风险?
  2. .set_password() 如何保存用户密码?它使用任何加密方法吗?
  3. 最重要的问题:用户可以在更改密码期间更改他的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


    【解决方案1】:

    是的。如果使用得当,Django 系统是相当安全的。 如果您打算进行一些自定义,您真的需要知道自己在做什么。
    这是来自 Django 的docs

    【讨论】:

      猜你喜欢
      • 2010-11-24
      • 2014-09-29
      • 2012-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-26
      相关资源
      最近更新 更多