在 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 令牌。