Django手动和使用csfr token来渲染表单

问题描述 投票:0回答:1

我觉得我慢慢的掌握了Django的使用方法,但是对于编程来说,我是比较陌生的,而且是自学的。我一直在模板中使用form.as_p和form_ul,但想更好的了解如何让它们看起来更好。我看了Django文档中关于如何手动渲染表单的内容。这似乎和宣传的一样,我可以在html页面上显示各个字段等。但是在文档中,这个问题被强调了。

表单和跨站请求伪造保护 Django提供了一个简单易用的跨站请求伪造保护。当通过POST提交表单时,你必须使用csrf_token模板标签,就像前面的例子一样。然而,由于CSRF保护并不直接与模板中的表单挂钩,因此本文档中的以下示例省略了这个标签。

我想我不明白最后一行是什么意思。我认为这意味着我可以随意渲染表单,但除非有一个Post请求正在进行,否则我不需要CSRF标记。

有没有一个例子可以说明如何手动渲染带有Post请求和CSRF令牌的表单?

我还假设,当我用 html 编写表单时,由于它们没有与模型和数据库交互,所以不需要 CSRF。这是因为所关注的漏洞通常是将一些不需要的东西注入到数据库中吗?

我看了一些其他的Django CSRF文档,对实现CSRF保护所需要的中间件有了一点了解,但我认为它假设了一些比我更详细的背景知识。有什么建议可以看一些东西来学习更多的知识,以便更好的了解POSTs和CSRF,我想还有Cookie等。

python html django csrf
1个回答
2
投票

我想这意味着我可以任意渲染表单,但除非有一个Post请求,否则我不需要CSRF令牌。

是的,PUT和POST请求需要CSRF令牌。它不是 所需 的GET请求。但你不应该使用GET来发送表单数据。

CSRF token不是一个 财产 的形式。这个令牌被应用程序用来验证来自客户端的请求。

有沒有一個例子可以說明如何用post requests和CSRF tokens來手動渲染表格?

正如在 文件这是很直接的。

<form action="{% url "submit-form-url-name" %}" method="post" accept-charset="utf-8">
    {% csrf_token %}
    {{ form.field1 }}
    {{ form.field2 }}
    ...
</form>

是因为关注的漏洞通常是向数据库中注入一些不需要的东西?

CSRF令牌是在服务器端生成的。它附加在用户的会话上,用来验证用户的请求。如果用户向服务器发送一些表单数据,目的是将这些数据持久化到数据库文件缓存中,那么验证该请求是否真的只是来自一个有效的用户是一个很好的做法。

...对实现CSRF保护所需要的中间件有了一点了解...。

Django提供了一个默认的CSRF中间件,而且配置、使用起来非常简单。请注意,CSRF已经不是OWASP十大安全问题了。虽然之前曾经是。

© www.soinside.com 2019 - 2024. All rights reserved.