这个问题涉及Django中的标准 UserCreationForm
,以及通过 request object
存储,提取和使用密码的方式 . 特别是我似乎能够通过 print(request.POST)
打印原始密码 . 文件内容将在本文末尾提供 .
我创建了一个注册页面 . 我已经设置了一个非常基本的 class-based view
来验证并记录新创建的用户 . 在这种情况下,该页面的实际 HTML
会自动呈现,通过 {{ form.as_p }}
,其中form是 UserCreationForm
的实例 .
怎么来的,当我执行print(request.POST)时,我得到了一些返回的内容:
<QueryDict: {'csrfmiddlewaretoken': ['keeping_this_private'], 'username': ['William'], 'password1': ['ACTUALPASSWORD'], 'password2': ['ACTUALPASSWORD'], 'button': ['']}>
这真的很安全吗?因为我只编程了几个月,我还在学习 .
Views.py:
class RegisterView(View):
def get(self, request):
form = UserCreationForm()
return render(request, 'authentication/registration.html', {'form': form})
def post(self, request):
form = UserCreationForm(request.POST)
if form.is_valid():
print(request.POST)
form.save()
username = form.cleaned_data.get('username')
raw_password = form.cleaned_data.get('password1')
user = authenticate(username=username, password=raw_password)
login(request, user)
return redirect('home')
else:
return render(request, 'authentication/registration.html', {'form': form})
Registration.html
{% extends 'base.html' %}
{% block body %}
<body class="text-center">
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit" name="button"></button>
</form>
</body>
{% endblock %}
Urls.py
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^register/$', RegisterView.as_view(), name='register'),
...
2 回答
是的,绝对是预期的 . 当用户在表单中提交密码时,它按原样提交(清除) . 没有其他选择,您需要清除密码才能检查其有效性 . 但是,应使用HTTPS协议保护POST数据的传输 .
在将其发送到服务器之前,您可能想在客户端对其进行哈希处理 . 然而,它根本没有增加安全性,因为在这种情况下,密码的散列版本成为实际密码 . 这是一种常见的安全感 .
我邀请您阅读this post on security.stackexchange了解更多详情
这是一个很好的问题,特别是来自编程新手的人 . 事实上,它基本上是完全不安全的 - 但是不可避免 . 传递散列密码实际上同样不安全,因为任何人(好吧,至少能够读取数据包的人)仍然可以阅读帖子内容,并且您确实需要从用户的客户端以某种方式将密码发送到您的服务器 . 请注意,实际上只有任何机密信息才会出现同样的问题,而不仅仅是密码 .
这里的解决方案是use https而不是http,所以请求's body is encrypted. It'仍然不是100%安全和安全(没有任何东西实际上是100%安全和安全)但是一个暴力攻击要么需要太多资源或太多时间 .