Django 中的 CSRF 令牌是什麼?


CSRF 代表跨站請求偽造,當惡意網站欺騙使用者無意中載入來自他們之前已進行身份驗證的網站的 URL 時,就會發生這種攻擊,從而利用他們的狀態並危及資料。

為了理解 CSRF 攻擊究竟是什麼,讓我們來看一個例子。假設您已登入 csrfexample.com 的網路郵件帳戶。

此網路郵件網站上的“登出”按鈕指向 URL csrfexample.com/logout。也就是說,您只需訪問頁面 csrfexample.com/logout 即可登出。

一個惡意網站可以透過在其頁面上隱藏該 URL 來強制您訪問 csrfexample.com/logout,這幾乎肯定是惡意的。

如果您已登入您的 csrfexample.com 帳戶並訪問包含指向 csrfexample.com/logout 的連結的惡意頁面,您將被登出 csrfexample.com。

顯然,在您不知情的情況下被登出網路郵件服務並不是一個嚴重的安全性問題,但如果同樣的入侵發生在網上銀行或電子商務網站上,則可能非常危險。

由於 CSRF 是一種常見的威脅,因此 Django 提供了一種簡單的方法來防止它。

Django CSRF 令牌

Django 提供了一個百分比 csrf 令牌百分比標籤,用於防止惡意攻擊。在伺服器上生成頁面時,它會生成一個令牌,並確保任何返回的請求都針對此令牌進行交叉檢查。該令牌不包含在傳入請求中;因此它們不會被執行。

以下程式碼片段摘自一個單詞計數 Django 專案。在該專案中,Django 渲染了一個包含表單的 html 頁面,該表單獲取使用者的文字輸入並返回該文字的單詞計數。

在此表單中,插入 csrf 令牌以防止對這些資料的攻擊。

<h1>
   WORD COUNT
</h1>
<a href="/home/">My Home</a>
{% csrf_token %} //csrf token inserted here.
<form action="count">
   <textarea cols="50" rows="10" name="FullText"></textarea>
   <br/>
   <input type="submit" value="CountMe"/>
</form>

防止 CSRF 攻擊

以下是防止 csrf 攻擊的步驟。

  • 第一步是確保所有 GET 請求都沒有副作用。這樣,如果惡意網站將您的頁面之一包含為 ,則不會產生負面影響。

  • 剩下的就是處理 POST 請求了。因此,我們繼續下一步。

  • 第二步是為每個 POST 提供一個隱藏欄位,其值是秘密的,並且是從使用者的會話 ID 生成的。

  • 然後,在伺服器端處理表單時,檢查該秘密欄位,如果它未透過驗證,則引發錯誤。

為了防止 csrf 攻擊,Django 提供了內建中介軟體。

django.contrib.csrf 包僅包含一個模組:middleware.py。此模組包含一個 Django 中介軟體類 CsrfMiddleware,它實現了 CSRF 保護。

要啟用此 CSRF 保護,請將 'django.contrib.csrf.middleware.CsrfMiddleware' 新增到 settings 檔案中的 MIDDLEWARE_CLASSES 設定中。

此中介軟體需要在 SessionMiddleware 之後處理響應,因此 CsrfMiddleware 必須出現在 SessionMiddleware 之前。這是因為響應中介軟體是按照從後到前的順序處理的。

更新於:2022 年 9 月 2 日

13K+ 瀏覽量

啟動你的 職業生涯

透過完成課程獲得認證

開始
廣告

© . All rights reserved.