2016-11-04 48 views
0

閱讀本section of the Django docs他們建議在cookie設置csrftoken並具有客戶端框架把這個將在服務器端請求驗證的標頭。但是,cookie中沒有令牌會破壞目的,因爲cookie是根據每個用戶的請求發送的?不明白Django的CSRF保護是如何工作的

或者是Django在頭文件中檢查該值的「安全性」,而不是檢查cookie值本身?

我不明白爲什麼這個工程的同步提交,但在這種情況下,csrftoken被直接寫入頁面,而不是存儲在cookie中,這似乎更安全。

OWASP page on reviewing code for CSRF

檢查,如果要求有一個有效的會話cookie是不夠的,我們需要 檢查,如果一個唯一的標識符與每個HTTP請求發送出去的 到應用程序。 CSRF請求將不具有此有效唯一 標識符。其理由CSRF請求將不會有這種獨特的請求 標識符的唯一ID被呈現作爲隱藏字段 在頁面上,被附加到一次鏈接/按鈕壓機 選擇的HTTP請求。攻擊者將不知道這個唯一的ID,因爲它是隨機的,並且每個鏈接每頁都動態呈現。

回答

3

你誤會了幾件事情。

令牌始終在cookie中;你鏈接到的代碼是爲了得到它的你的JS中的cookie,以便你可以發回它。

問題是,正如您的報價顯示的那樣,一個攻擊者試圖從不在該網站上的頁面發佈帖子將不會擁有該cookie,因此無法將正確的值插入到該表單中,或者標題。

+0

「令牌始終在cookie中」不正確。另外,正常形式(不通過ajax發送)必須在隱藏輸入字段中包含csrf標記。 –

+0

我從OWASP頁面瞭解到,Cookie不是處理這個問題的好方法,因爲它們會自動爲域設置。所以,如果我讓你點擊www.socialnetwork.com/myAccount/delete,你的cookies將被髮送,就像每個www.socialnetwork.com請求發送一樣。 你是說在一個頭部而不是cookie中檢查csrftoken的行爲是什麼使得這是一種可行的方法? – diplosaurus

+1

@AntonBessonov CSRF保護通過將cookie與頭部/隱藏輸入進行比較來工作。如果沒有利用其他漏洞(如XSS),潛在的攻擊者無法從Cookie獲得正確的值,所以在發生攻擊時,頭/隱藏輸入中的CSRF令牌將不具有與cookie相同的值。當這些值不匹配時,請求被拒絕。然而,爲了這個工作,令牌必須始終設置在cookie中。 – knbk

0

我不熟悉Django的CSRF保護,但我認爲它像在其他框架中其他CSRF保護工作。

的訣竅是,通過cookie,並使用客戶端發送頭CSRF令牌向客戶端發送回服務器。服務器忽略cookie,但不是標題。它如何防止csrf攻擊?例如,攻擊者可以綁定<img src="yourwebsite.com/action/destroy/data">(或通過javascript發送post請求)。您的瀏覽器發送csrf cookie(以及會話cookie)。由於標題丟失 - 防止了攻擊。

相同的形式。我認爲,標題和表單都是平等的。

但是在這兩種情況下,如果您有xss漏洞,則會丟失。

編輯:正如Daniel指出的那樣,刪除csrf cookie是有意義的。但這不是出於安全原因。

+0

Cookie不會被忽略,它在Django的CSRF保護中是_essential_。丹尼爾指出,讀取cookie是有意義的,而不是去除cookie。攻擊者可以通過一些隨機的CSRF令牌來簡單地添加頭或隱藏的輸入字段,因此僅僅檢查這是不夠的。爲確保保護,標題/隱藏輸入值必須與cookie的值相同。攻擊者將無法獲得cookie的值,因此僞造的請求將在cookie和header/hidden輸入中具有不同的值,並被拒絕。合法的請求將具有匹配的值。 – knbk