2013-04-17 86 views
5

我被問及有關Cookie重播攻擊與我的ASP.NET網站表單身份驗證。表單身份驗證 - Cookie重播攻擊 - 保護

我遵循以下建議以防止任何攻擊,但認爲如果有人設法訪問cookie(儘管只是很短的時間),該網站仍然很脆弱。有沒有辦法徹底銷燬註銷窗體身份驗證會話,這樣即使有人偷餅乾就沒有惡意使用它的機會

諮詢隨之而來的是

我們相信,我們已經採取了所有負責任的步驟我們可以在ASP.NET的範圍內防範這一點。請參閱下面的詳細回覆。

但是我們已經實施的建議步驟從微軟來抵禦這種(見http://support.microsoft.com/default.aspx?scid=kb;en-us;900111

·身份驗證Cookie不會被寫入到客戶機上使其難以竊取。

·應用程序正在通過SSL這樣一個cookie從未發出過一個非安全連接可運行的

·我們實行絕對過期用15分鐘超時意味着任何問題,Cookie是該期限

後無用

·我們使用httpOnly cookie,因此沒有人可以在語法上攔截或更改此cookie。

因此,即使上述措施被打破,我們認爲非常不可能,惡意用戶將只能使用15分鐘的窗口,打破的注意事項,併成功登錄

+0

你使用HSTS,你設置cookies上的'安全'標誌? – CodesInChaos

回答

6

一個簡單的想法是生成隨機GUID並將其存儲在cookie的用戶數據部分。然後,當用戶註銷時,您從用戶數據中檢索guid,並將其寫入服務器端存儲庫,並註釋該「會話」已結束。

然後,有一個http模塊,用於檢查每個請求是否來自cookie的userdata部分的guid沒有指向已結束的會話。如果是,則終止該請求,併發出一條警告,即重新使用過期的cookie。

這帶來了每個請求額外查找的成本。

+3

額外的成本是這種方法不能很好地擴展,因爲在一個使用頻繁的Web應用程序中,你將很快擁有一個充滿GUID的巨大表格。將當前會話的GUID存儲在數據庫中的用戶行中,並且在用戶註銷時將其設置爲NULL會更好嗎?這樣,您最多可以存儲<用戶數> GUID。 – thomaskonrad

+1

@ tooom:當同一用戶有多個活動的獨立會話(例如,在不同的瀏覽器中)並且終止其中一些會話而不終止其他會話時,這可能會導致問題。 –

+0

沒錯。如果想要支持多個併發會話,則具有一對多關係的單獨會話GUID表可以解決該問題。我只是不喜歡存儲過期的GUID的想法,因爲如果你認真對待這個問題,你必須永久存儲它們,以便以後不重新啓用舊的會話。存儲活動GUID可能與10個併發會話的合理限制相結合,限制了人們必須存儲的最大GUID數量。 – thomaskonrad

3

有沒有辦法徹底摧毀窗體身份驗證會話 上登出這樣即使有人偷餅乾會有 沒有使用它惡意

的方法是保持跟蹤你的服務器用戶被註銷,什麼時間上的機會,所以即使它走了要使用有效的身份驗證Cookie查看頁面,請仔細檢查此用戶是否也登錄了服務器記錄。

這意味着您必須在數據庫上有一個額外的表來保留和檢查用戶狀態的登錄註銷,而不是100%依賴於身份驗證Cookie。

有沒有辦法徹底銷燬註銷

在最壞的情況下窗體身份驗證會話 該Cookie被盜,你卻不能。

這是爲什麼呢,因爲表單身份驗證實際上是保存在cookie上的所有數據(比如何時到期,誰是用戶等)。所以你不能刪除它,存在於cookie上,另一種方法是將它與服務器上的自定義數據同步,並具有額外的安全級別。

相關:Can some hacker steal the cookie from a user and login with that name on a web site?

+0

Cookie的用戶數據部分可用於存儲可用於將表單cookie與服務器端持久信息相關聯的附加信息。因此,實際上您可以檢測會話結束後是否重新使用cookie。 –

+0

@WiktorZychla但是,如果黑客獲取和替換會話cookie與登錄的cookie?然後通過你的支票。 – Aristos

+0

有一個加密的表單cookie,會話數據中帶有guid。這個guid不對應於服務器端的會話,而只是一個額外的獨特的防護令牌。 –

0

我實現了一個系統,將SessionID存儲在第一個已驗證請求的auth cookie中,然後驗證活動SessionID是否與後續請求中的cookie匹配。 Details on this answer.這避免了在@ WiktorZychla的答案中建議的服務器端跟蹤。

這可能可以通過在會話和auth cookie中存儲Incoming IP + Request.Browser + SessionID的散列而不僅僅是SessionID來改進。