在 Django 中,CSRF 令牌的生成和检查过程是通过 Django 的 CSRF 中间件 (CsrfViewMiddleware
) 和模板标签 ({% csrf_token %}
) 自动处理的。以下是详细的生成和检查过程:
CSRF 令牌的生成过程
-
用户访问页面:
- 当用户第一次访问页面时,Django 会为用户创建一个会话。如果用户还没有会话,Django 会创建一个新的会话 ID。
-
生成 CSRF 令牌:
- Django 生成一个随机的 CSRF 令牌,并将其与用户的会话相关联。这个令牌是一个随机的字符串,具有足够的长度和复杂性,以防止猜测攻击。
- 令牌通常存储在用户的会话中,可以通过
request.session
访问。
-
嵌入 CSRF 令牌:
- 在每个需要保护的表单中,Django 通过模板标签
{% csrf_token %}
自动嵌入 CSRF 令牌。这个标签会生成一个隐藏的输入字段,包含当前会话的 CSRF 令牌。 - 示例:
<form method="post" action="/submit/"> {% csrf_token %} <!-- 其他表单字段 --> <input type="submit" value="Submit"> </form>
- 在每个需要保护的表单中,Django 通过模板标签
CSRF 令牌的检查过程
-
用户提交表单:
- 当用户提交表单时,CSRF 令牌会作为隐藏字段包含在请求中。
- 对于 AJAX 请求,令牌通常包含在请求头中。
-
CSRF 中间件检查请求:
CsrfViewMiddleware
会拦截所有进入的 POST、PUT、PATCH 和 DELETE 请求,并检查 CSRF 令牌。