2015-01-14 46 views
9

我在ASP.NET MVC 5應用程序中實現CSRF防僞保護。特別是,我參考了Mike Wasson在ASP.NET website上描述的方法,以保護響應AJAX請求的控制器方法,例如WebAPI控制器。該方法使用AntiForgery.GetTokens方法來生成基於用戶的加密防僞令牌,然後使用AntiForgery.Validate來驗證所提交的令牌屬於當前用戶。ASP.NET MVC CSRF防僞令牌過期了嗎?

我的問題是這樣的:有沒有這些令牌的生存時間?他們是否過期,如果是,他們有多長時間?該文檔在該主題上是靜音的。

我不想在我的系統中允許不過期的令牌。另外,我想在向客戶傳達需要多少時間之前請求一個新的令牌。如有必要,我可以使用FormsAuthentication.Encrypt來實現到期令牌;然而,如果到期已經建成​​類的方法,那麼我想省下不必要的複雜性。

+1

我想知道這一點。嘗試查看源代碼:https://github.com/ASP-NET-MVC/aspnetwebstack/blob/4e40cdef9c8a8226685f95ef03b746bc8322aa92/src/System.Web.WebPages/Helpers/AntiForgery.cs – nmit026

回答

3

這個想法是,每個易受攻擊的HTTP POST都會生成兩個令牌並直接發送到服務器。因此,如果您單擊表單上的「提交」按鈕,則會生成兩個令牌:基於用戶憑據的cookie和表單值,以便在此處閱讀(不錯的書面文章):http://www.asp.net/mvc/overview/security/xsrfcsrf-prevention-in-aspnet-mvc-and-web-pages

cookie令牌,除了嘗試使用匿名身份驗證的情況外,實際上可以過期的是冗餘的,而不是系統所必需的。例如。請參閱此處(第一個答案): MVC 2 AntiForgeryToken - Why symmetric encryption + IPrinciple?

儘管如此,您的其他令牌對於攻擊者來說是不可讀的,並且這些令牌會隨每個新請求一起生成。因此,不必擔心到期日期。

編輯:其實,這一切也可以在你指的是(邁克·沃森)文章的註釋部分閱讀;)

+7

感謝您的回覆。我理解這兩個標記如何工作​​的概念,並理解HTML表單與AJAX請求之間微妙但不同的方法。但是,我的問題具體是代幣是否過期,這在文檔或Mike Wasson的帖子的評論中沒有討論。乾杯! – kbrimington

+1

@kbrimington上述[第一篇文章](https://docs.microsoft.com/zh-cn/aspnet/mvc/overview/security/xsrfcsrf-prevention-in-aspnet-mvc-and-web-pages) IAntiForgeryAdditionalDataProvider部分朝向頁面底部,似乎意味着它沒有到期。它說你可以實現額外的檢查和狀態「驗證例程可以實現超時(通過檢查當前時間與創建令牌時存儲的時間),一個隨機數檢查例程或任何其他所需的邏輯。」你有沒有得到有關令牌過期的明確答案? –

+1

@DavidYates,感謝您提醒我注意。當時,我認爲他們不能過期,我建立了我自己的到期邏輯。我不記得2.5年前當我問我的問題時這篇文章出現在這篇文章中。它似乎是'IAntiForgeryAdditionalDataProvider'的意圖,以允許令牌及其驗證邏輯的簡單定製,包括實現超時的能力。 – kbrimington