【发布时间】:2021-11-25 05:31:01
【问题描述】:
我为我的用户设置了密码重置选项。但我发现很少有安全风险:
1) 密码重置链接未过期: 现在我的密码重置链接未过期。我希望密码重置链接只能使用一次。用户不能第二次使用它来更改他的密码
2)如果用户更改HTML的值,如何防止密码更改:让你解释一下。我有一个像 <input type="hidden" name="user_id" value="{{user_id}}"> 这样的 html 隐藏输入文件,如果用户更改了 user_id 的 html 值,那么我想防止更改密码。这是我的代码:
token.py 用于发送到邮件的密码重置链接
def send_forget_password_mail(email,token):
subject = 'EXAMPLE.COM Password Reset Link'
message = f'hi your forgot password link http://127.0.0.1:8000/change-password/{token}'
email_from = 'noreply@EXAMPLE.com'
recipient_list =[email]
send_mail(subject,message,email_from,recipient_list)
return True
views.py
这是忘记密码视图,用户提交邮件以获取密码重置链接。在这里,我还将令牌保存在用户配置文件中。
def ForgetPassword(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:rest-password')
user_obj = User.objects.get(email=email)
print(user_obj)
token = str(uuid.uuid4())
profile_obj = UserProfile.objects.get(user=user_obj)
profile_obj.forget_password_token = token
profile_obj.save()
send_forget_password_mail(user_obj.email,token)
messages.success(request, "An password reset link sent to your email")
return redirect('members:reset-password')
return render(request, 'members/password_reset_form.html')
这是用户更改密码的视图。
def ChangePassword(request,token):
profile_obj = UserProfile.objects.filter(forget_password_token=token).first()
User = get_user_model()
print(profile_obj)
if request.method == "POST":
password1 = request.POST.get('password1')
password2 = request.POST.get('password2')
user_id = request.POST.get('user_id')
if user_id is None:
messages.success(request, "user not found")
return redirect(f'http://127.0.0.1:8000/change-password/{token}')
if password1 != password2:
messages.success(request, "password didn't match")
return redirect(f'http://127.0.0.1:8000/change-password/{token}')
user_obj = User.objects.get(id =user_id)
user_obj.set_password(password1)
user_obj.save()
messages.success(request, "your password sucessfully changed")
return redirect('members:login')
context ={'user_id':profile_obj.user.id}
print(context)
return render(request,'members/password_change.html',context)
【问题讨论】:
标签: python python-3.x django