2012-07-23 58 views
7

處於餅乾初學者,CSRF和Django的(使用1.4),從我可以做出來,這是它是如何工作的,請大家指正我走到哪裏錯了...Django的CSRF保護是如何工作的?

以下適用其中django.middleware。 csrf.CsrfViewMiddleware包含在MIDDLEWARE_CLASSES元組中。

如果POST表單包含csrf_token標記,並且有關視圖將RequestContext傳遞給模板,則請求頁面意味着Django包含一個隱藏表單域,其中包含字母數字字符串。 Django還會向瀏覽器返回一個名稱設置爲csrftoken的cookie,並將值設置爲相同的字母數字字符串。

當接收到表單提交時,Django檢查來自隱藏表單字段的字母數字字符串值和從瀏覽器接收到的csrftoken cookie。如果它們不匹配,則發出403響應。

CSRF攻擊可能以包含iframe的惡意網站的形式出現。 iframe包含一個POST表單和一些JavaScript。表單的action屬性指向我的Django站點。該表單旨在在我的網站上做一些令人討厭的事情,並且JS在加載iframe時提交表單。

瀏覽器將在表單提交的標題中包含csrftoken cookie。但是,表單不包含匹配字母數字字符串的隱藏字段,因此將返回403並且攻擊失敗。如果iframe JS嘗試訪問cookie,以便創建正確的隱藏表單域,瀏覽器將阻止它進行此操作。

這是正確的嗎?

+1

我沒有看到任何錯誤。也許別人會,但總的來說,你明白了。 – Zashas 2012-07-24 18:21:33

回答

0

我會說,你是對的。你會發現我自己的公式化爲here

總結:

  • 的CSRF令牌從代碼,這意味着惡意代碼必須知道它發送。
  • CSRF令牌存儲在Cookie中並由瀏覽器發送。
  • 由於同源策略,攻擊者無法訪問cookie。
  • 服務器可以簡單地驗證來自cookie的「安全」值與來自代碼的「安全」值是否相同。
1

我認爲你想要的是在官方的Django文檔中描述的。 https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#how-it-works

上面的鏈接,當我試圖被打破,但對於1.7版本的作品: https://docs.djangoproject.com/en/1.7/ref/contrib/csrf/

+1

感謝您的鏈接。它說:「這可以確保只有源自您網站的表單才能用於POST數據返回。」但它並沒有說它確保。 – 2012-10-01 13:54:54

+0

我最近沒有看過Django代碼庫的那部分內容,但是如果我從其他地方知道,它使用UrlParse檢測基本URL,並且如果基本URL與主機URL不匹配,它將返回錯誤或以靜默方式失敗。 (當你試圖返回一個響應給另一個方案如foo時,它會靜默失敗:// – fundamol 2013-04-30 20:46:11