Django:通过request.POST的原始密码

时间:2018-03-13 10:44:59

标签: python django

这个问题涉及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 个答案:

答案 0 :(得分:5)

是的,绝对是期待的。当用户在表单中提交密码时,它按原样提交(清除)。没有其他选择,您需要清除密码才能检查其有效性。但是,应使用HTTPS协议保护POST数据的传输。

在将其发送到服务器之前,您可能想在客户端对其进行哈希处理。然而,它根本没有增加安全性,因为在这种情况下,密码的散列版本成为实际密码。这是一种常见的错误安全感。

我邀请您阅读this post on security.stackexchange了解更多详情

答案 1 :(得分:3)

这是一个很好的问题,特别是来自编程新手的人。事实上,它基本上是完全不安全的 - 但是不可避免。传递散列密码实际上同样不安全,因为任何人(好吧,至少能够读取数据包的人)仍然可以阅读帖子内容,并且您确实需要从用户的客户端以某种方式将密码发送到您的服务器。请注意,实际上只有任何机密信息才会出现同样的问题,而不仅仅是密码。

此处的解决方案是use https而不是http,因此请求的正文已加密。它仍然不是100%安全和安全(没有任何东西实际上是100%安全和安全)但是一个暴力攻击需要太多资源或太多时间。