Django 手动渲染表单并使用 csrf 令牌

Django Rendering Forms Manually and using csfr token

我想我正在慢慢掌握 Django 的窍门,但在编程方面相对较新并且是自学的。我一直在模板中使用 form.as_p 和 form_ul,但想更好地了解如何使它们看起来更好。我查看了有关如何手动呈现表单的 Django 文档。这似乎与宣传的一样有效,我可以在我的 html 页面上显示各个字段等。但是在文档中突出显示了这一点:

Forms and Cross Site Request Forgery protection Django ships with an easy-to-use protection against Cross Site Request Forgeries. When submitting a form via POST with CSRF protection enabled you must use the csrf_token template tag as in the preceding example. However, since CSRF protection is not directly tied to forms in templates, this tag is omitted from the following examples in this document.

我不明白最后一行的意思。我认为这意味着我可以随心所欲地呈现表单,但除非有 Post 请求,否则我不需要 CSRF 令牌。

是否有示例说明如何使用 post 请求和 CSRF 令牌手动呈现表单?

我还假设当我在 html 中编写表单时,由于它们不与模型和数据库交互,因此不需要 CSRF?那是因为关注的漏洞通常是将不需要的东西注入数据库吗?

我查看了其他一些 Django CSRF 文档,对如何需要中间件来实现 CSRF 保护有了一些了解,但我认为它比我拥有更详细的背景知识。任何关于阅读以了解更多信息以更好地理解 POST 和 CSRF 的建议,我想是 cookie 等。

I assume it means that I can render the form all I want, but unless there is a Post request being made I don't need a CSRF token.

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

CSRF 令牌不是 属性 的形式。应用程序使用此令牌来验证来自客户端的请求。

Is there an example of how to manually render forms with post requests and CSRF tokens?

docs 中所述,非常简单。

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

Is that because the vulnerability of concern is usually injecting something unwanted into the database?

CSRF 令牌在服务器端生成。它附加到用户的会话,用于验证用户请求。如果用户向服务器发送一些表单数据,目的是将该数据保存在 database/file/cache 中,那么验证该请求是否真的仅来自有效用户是一个很好的做法。

...got a little bit of an idea of how the middleware is needed to implement CSRF protection...

Django 提供了一个默认的 CSRF 中间件,配置和使用起来非常容易。
请注意,CSRF 不再是 OWASP 前 10 大安全问题。虽然以前是。