1. 程式人生 > >Django 中 csrf 的保護機制

Django 中 csrf 的保護機制

什麼是 CSRF

CSRF, Cross Site Request Forgery, 跨站點偽造請求。舉例來講,某個惡意的網站上有一個指向你的網站的連結,如果

某個使用者已經登入到你的網站上了,那麼當這個使用者點選這個惡意網站上的那個連結時,就會向你的網站發來一個請求,

你的網站會以為這個請求是使用者自己發來的,其實呢,這個請求是那個惡意網站偽造的。

Django 提供的 CSRF 防護機制

django 第一次響應來自某個客戶端的請求時,會在伺服器端隨機生成一個 token,把這個 token 放在 cookie 裡。然後每次 POST 請求都會帶上這個 token,

這樣就能避免被 CSRF 攻擊。

在返回的 HTTP 響應的 cookie 裡,django 會為你新增一個 csrftoken 欄位,其值為一個自動生成的 token 在所有的 POST 表單時,必須包含一個 csrfmiddlewaretoken 欄位 (只需要在模板里加一個 tag, django 就會自動幫你生成,見下面) 在處理 POST 請求之前,django 會驗證這個請求的 cookie 裡的 csrftoken 欄位的值和提交的表單裡的 csrfmiddlewaretoken 欄位的值是否一樣。如果一樣,則表明這是一個合法的請求,否則,這個請求可能是來自於別人的 csrf 攻擊,返回 403 Forbidden. 在所有 ajax POST 請求裡,新增一個 X-CSRFTOKEN header,其值為 cookie 裡的 csrftoken 的值 Django 裡如何使用 CSRF 防護 首先,最基本的原則是:GET 請求不要用有副作用。也就是說任何處理 GET 請求的程式碼對資源的訪問都一定要是“只讀“的。 要啟用 django.middleware.csrf.CsrfViewMiddleware 這個中介軟體 再次,在所有的 POST 表單元素時,需要加上一個 {% csrf_token %} tag 在渲染模組時,使用 RequestContext。RequestContext 會處理 csrf_token 這個 tag, 從而自動為表單新增一個名為 csrfmiddlewaretoken 的 input