Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:通过request.POST获得原始密码_Python_Django - Fatal编程技术网

Python Django:通过request.POST获得原始密码

Python Django:通过request.POST获得原始密码,python,django,Python,Django,这个问题涉及Django中的标准UserCreationForm,以及通过请求对象存储、提取和使用密码的方式。特别是,我似乎能够通过print(request.POST)打印原始密码。文件内容将在本文末尾提供 我已经创建了一个注册页面。我已经建立了一个非常基本的基于类的视图,用于验证新创建的用户并将其登录。在本例中,该页面的实际HTML通过{{form.as\u p}}自动呈现,其中form是UserCreationForm的实例 为什么,当我执行print(request.POST)时,我得到

这个问题涉及Django中的标准
UserCreationForm
,以及通过
请求对象存储、提取和使用密码的方式。特别是,我似乎能够通过
print(request.POST)
打印原始密码。文件内容将在本文末尾提供

我已经创建了一个注册页面。我已经建立了一个非常基本的
基于类的视图
,用于验证新创建的用户并将其登录。在本例中,该页面的实际
HTML
通过
{{form.as\u p}}
自动呈现,其中form是
UserCreationForm
的实例

为什么,当我执行print(request.POST)时,我得到了与返回的内容类似的东西:

<QueryDict: {'csrfmiddlewaretoken': ['keeping_this_private'], 'username': ['William'], 'password1': ['ACTUALPASSWORD'], 'password2': ['ACTUALPASSWORD'], 'button': ['']}>
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 %}

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

在将其发送到服务器之前,您可能会尝试在客户端对其进行哈希处理。然而,它并没有增加任何安全性,因为在本例中,密码的哈希版本将成为实际密码。这是一种常见的安全感


我邀请您阅读更多细节

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


这里的解决方案是替换http,以便对请求的主体进行加密。它仍然不是100%安全的(实际上没有什么是100%安全的),但是暴力攻击要么需要太多的资源,要么需要太多的时间

您能否在客户端使用预先约定的salt对密码进行哈希处理以避免此问题?salt应该由服务器发送,并根据每个请求进行更改。那样的话,拦截散列将是无用的,因为它只对特定的请求有效。谢谢你给出了一个非常准确的答案。Django是否自动处理HTTPS协议?我真的需要使用表单小部件吗?或者我可以只编写自己的HTML,只要每个输入的基本要求是完整的(“名称”与Django生成的HTML等相同),然后只使用表单进行验证?在不失去任何安全的情况下?@TomOldbury这是个好问题。我认为这在理论上是可行的,但在实践中设置起来会有点痛苦。我邀请您在internet上进行研究,如果您找不到任何东西,请访问security.stackexchange.com。另外,我要说的是,如果有人能够截获密码,即使您使用的是正确的HTTPS连接,发现漏洞利用它可能是小菜一碟。@WilliamKarlsson,设置Django以支持HTTPS是非常容易的,但是您应该配置您的web服务器(即nginx或apache)以使用HTTPS并生成SSL证书。
{% 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 %}
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^register/$', RegisterView.as_view(), name='register'),
    ...