2013-07-02 29 views
1

在我的網站上,我將一個隱藏字段放入一個隨機值中,同時我還將該值存儲在會話中。提交表單時,我確保提交的值與會話值相匹配。您是否需要提交cookie作爲CSRF保護的一部分?

CSRF保護足夠嗎?任何黑客攻擊網站以迫使用戶不知不覺地發佈到我的網站的人都不知道我生成了什麼CSRF標記,因此他們的攻擊將失敗。獲取該令牌的唯一方法是對服務器執行GET請求,並將該Cookie解壓出來併發布。

這可能嗎?或者換句話說,你是否必須包含一個cookie作爲CSRF保護的一部分?我沒有看到它在這裏提到:https://www.owasp.org/index.php/Cross-Site_Request_Forgery_%28CSRF%29_Prevention_Cheat_Sheet#Disclosure_of_Token_in_URL

除了'雙提交cookie'部分。

回答

2

是的,這對於CSRF保護是足夠的。爲了獲得最大限度的保護,請確保隱藏的隨機值(CSRF令牌)在每次發出請求時都會更改。

通常建議使用Cookie,因爲它們易於使用,大多數Web框架都有內置的便捷方式來利用它們。

+0

謝謝您的回答。你認爲如果你使用cookie,你不需要在會話中存儲任何東西?你可以創建一個cookie,將一個隨機值放入cookie和一個隱藏字段,並檢查它們是否匹配?將cookie指定爲HttpOnly,以防止黑客讀取內容。 – NibblyPig

+1

不幸的是,您將不得不將其存儲在服務器端進行驗證。如果不這樣做,惡意服務器可以提交「隱藏​​字段值」和「cookie」(基本上任何組成的值都匹配)並繞過您的控件。換句話說,他們不需要獲得原始的令牌值,因爲他們可以在沒有它的情況下通過測試。如果您嘗試僅使用某些有效的值來測試欺騙,則攻擊者可以通過使用您的站點(如正常情況)並使用該值來收集一個值。這是討厭的生意:-) –

0

一般來說,這是一個很好的方法。

有一個會話固定預防的互動,你會想檢查。當用戶登錄(或通過其他方式更改其會話的權限級別,例如更改用戶,新帳戶或通過密碼重置進行隱式登錄時),應該丟棄舊會話存儲的反CSRF令牌和生成一個新的。

這樣一來,如果攻擊者設法針對您的應用程序進行會話修復攻擊,他們將無法使用它來將您加入會話,等待您登錄,然後CSRF您。當然,你應該確保會話固定不會發生,但這是一個有用的深度測量防禦。 (特別是因爲一些潛在的會話固定路由,例如來自脆弱鄰居域的cookie注入,可能不在開發者的控制範圍內。)

這通常很簡單,因爲在特權級別更改時,您應該已經失效並重新發佈會話標識符,以阻止會話修復攻擊獲得對帳戶的完全訪問權限。儘管您正在忙於此,但也要更改CSRF令牌。

(有,但是,沒有必要重新生成CSRF令牌要求,一些導遊推薦 - 這會讓你的應用程序脆弱,導航和多標籤使用)