2012-03-30 61 views
6

我寫下了我對csrf protcetion機制的理解django。請糾正我是否有問題。瞭解csrf在django隱藏字段中的形式和CSRFCookie

csrfViewMiddleware創建一個唯一的字符串並將其存儲在源自主機的窗體的隱藏字段'csrfmiddlewaretoken'中。由於模仿此表單的惡意網站無法知道此字段的值,因此無法使用它。

當有人試圖發佈表單時,網站會檢查'csrfmiddlewaretoken'字段及其值。如果錯誤或未設置,則檢測到csrf嘗試。

但是,究竟​​究竟是什麼? The doc表示在​​和hidden field中設置了唯一的值。這是我感到困惑的地方。Cookie是否被嵌入唯一字符串發送到瀏覽器?我希望有人能夠清楚地解釋這一點。

謝謝你,

回答

5

好了,所以在這裏不用我解釋:

的Django分配一個身份驗證的用戶存儲在cookie中CSRF令牌。每次用戶發出被認爲「不安全」的請求(即POST,PUT,DELETE)時,都會讀取此Cookie中的值,以驗證用戶而非惡意第三方是否正在提出請求。

您放置在表單中的CSRF標記實際上會從Cookie中抓取CSRF標記,然後在您提交表單時將其作爲POST變量傳遞。

希望這可以讓它更清晰一些。

+0

因此,只有經過身份驗證的用戶的瀏覽器才能獲取此令牌,而不是每個訪問該網站的人。是否正確? – damon 2012-03-30 03:46:06

+0

不知道Django如何處理它 - 它可以保護所有用戶而不管身份驗證狀態如何。基本上任何能夠改變應用程序某個方面的動作都應該有CSRF保護。 – Todd 2012-03-30 03:49:51

1

根據我目前的理解,我對完整答案並不完全滿意。

你可以找到我的版本here

總之,CSRFCookie是「安全的」,因爲攻擊者由於同源策略而無法訪問它。瀏覽器會自動發送此值。現在,您的表單也必須發送此值(例如,在隱藏字段中)。這意味着你的表單必須知道這個值,並且它可以從cookie中獲取它。

攻擊者無法從cookie獲取令牌,因此無法僞造包含令牌的惡意代碼。

重要的是,最終,用戶可以發送csrf令牌,並且服務器可以驗證它。使用cookie是這樣做的一種便捷方式,但這可以以不同的方式實現(例如,服務器可以爲每個會話保存CSRF令牌)。

我不是專家,但這是我的理解。希望能幫助到你。