2011-09-15 91 views
11

我剛剛在我的應用程序中設置了一個簡單的CSRF保護。它會創建一個獨特的麪包屑,在提交表單時會根據會話值進行驗證。CSRF令牌 - 如何正確實施?

不幸的是,這意味着現在我無法讓我的應用程序的多個實例(瀏覽器中的標籤)同時打開,因爲CSRF碎屑相互碰撞。

我應該爲每個實際表單創建一個單獨的令牌還是爲所有表單使用共享的碎屑? 這裏有什麼常識?

回答

5

你也可以做。這取決於你想要的安全級別。

OWASP企業安全API(ESAPI)使用單個令牌每用戶會話方法。這可能是一種非常有效的方法,假設您沒有XSS漏洞,並且您的會話超時時間相當短。如果您允許會話保持活動幾天或幾周,那麼這不是一個好方法。

就個人而言,我不覺得很難爲每個表單的每個實例使用不同的標記。我用鍵值對在用戶會話中存儲結構。每個項目的關鍵是表單的ID,該值是包含該標記的另一個結構以及該標記的到期日期。通常我只會讓一個令牌活10到20分鐘,然後過期。對於更長的表格,我可能會給它很長的到期時間。

如果您希望能夠在同一個會話的多個瀏覽器選項卡中支持相同的表單,那麼我的方法會變得有點詭計,但仍然可以通過具有唯一表單ID輕鬆完成。

+0

你的意思是,每個表單的每個實例都有自己的標記? IE瀏覽器。 ''? – Industrial

+4

我認爲只要你不通過http(僅https)提交它們,每個會話只有一個令牌是合理的。他們與會話ID共享許多安全問題。如果您擁有XSS,攻擊者可以打開iframe,讀取令牌,然後執行CSRF。 – Erlend

+0

如果你有XSS,你已經輸了。額外的表單隨機數不會節省您(攻擊者將能夠獲得一個新的表單,新的隨機數,填寫和提交,就像用戶一樣)。每個用戶的單一價值對CSRF來說絕對是足夠的。 – Kornel

1

首先:我不是安全專家,所以你可能不應該相信我說的話。

我認爲爲每個表單生成不同的令牌更安全。考慮一個頁面上的XSS漏洞,允許攻擊者獲取該表單的CSRF標記。如果所有表單使用相同的標記,則攻擊者現在擁有所有表單的CSRF標記。如果所有表單都有不同的標記,則攻擊範圍可能會小得多。

+3

對不起,但是如果你有XSS,攻擊者可以簡單地打開給定表格的iframe,然後讀取它們的標記。如果你有XSS,令牌方法失敗,並且雙重提交cookie方法也可以避免XSS。 – Erlend

-3

當我知道CSRF,您可以使用

1)隨機數並保存到會話:
將它添加到所謂的隱藏隱藏的輸入,那麼當你recive信息,您可以檢查隱藏字段會話值

2)靜態配置變量(像以前但沒有會話)
隱藏字段將包含該值(從配置變量)。當你確認,你將檢查隱藏發佈和配置安全密鑰值

3)HTTP引用
您可以使用HTTP引薦知道用戶來自然後與實際域檢查(這種方法可以攻擊如果您的網站包含xss)。

正如我知道你可以使用任何解決方案:)

+1

你的第二個例子;你如何建議使用靜態變量作爲CSRF令牌?令牌背後的全部理念是它們的獨特性,這意味着沒有人應該能夠事先猜測令牌是什麼。這究竟如何使任何形式更安全? – Industrial

+1

2不起作用,因爲關鍵不是每個用戶的個人。 3不推薦使用,因爲很多公司的防火牆都會去掉引用標頭,這實在是不可行的。 – Erlend

+0

HTTP Referer不是一個可靠的方法來擊敗CSRF。 (都不是靜態變量。) –

4

OWASP Cheat Sheet有這樣的事情是最明確的答案。它討論了不同的方法和安全性與可用性的平衡。

簡而言之,他們建議每個(瀏覽器)會話都有一個令牌。換句話說,就你的情況而言,標籤之間共享相同的標記。備忘單還強調,不要將您的站點暴露在跨站點腳本漏洞中,因爲這會破壞每個會話CSRF令牌策略。