2013-08-05 232 views
1

而不是使用ASP.NET MVC用戶的系統,如下所示:ASP.NET MVC 4和會話安全漏洞

當他登錄信息(用戶名+密碼),我取從數據庫和一套相應的用戶:

Session["UserId"] = fetchedUser.UserId; 

然後,我總是檢查他是否在登錄:

if (Session["UserId"] != null && ...) 

的問題是,如果有人複製ASP.NET_SessionId的從價值登錄用戶(例如:用戶去衛生間和坐在他旁邊的同事用鉻檢查員檢查他的餅乾),然後他將能夠在他的電腦中創建一個cookie並作爲該用戶。

Chrome's inspector

我的問題是:如果會話ID保存在cookie中

  1. 爲什麼會議比餅乾更安全嗎?
  2. 我可以讓這更安全(並繼續使用會話)嗎?
  3. 內部ASP.NET用戶認證系統如何做到這一點?
+0

除非你在學習,否則安全不是你想要做的事情。你確定你不應該使用內置的安全性? –

回答

6

不使用Session作爲身份驗證機制的主要原因是它可能使您的應用程序容易受到Session Fixation的影響。例如,如果用戶使用HTTP協議到達您的站點並收到存儲在ASP.NET_SessionId cookie中的會話ID,則可能會出現問題。用戶稍後可以登錄,即使您的登錄頁面可能在HTTPS下受到保護,會話令牌已經在HTTP下生成,這意味着它已經使用明文傳輸。

爲了回答您的其他點:

爲什麼如果會話ID保存在一個 餅乾的會議比餅乾更安全嗎?

存儲在會話中的數據存儲在服務器端,所以攻擊者更難以篡改這些數據。所有的cookie存儲都是這些數據的標記,而不是數據本身。儘管如此,使用FormsAuthenticationProvider仍然更安全,因爲這會在完成登錄後創建新的身份驗證令牌,而不是會話開始,原因在於避免上述會話固定。

我可以讓這更安全嗎?(並繼續使用會話)?內部ASP.NET用戶認證系統如何做到這一點?

內置提供者已經適合用途,所以最好使用它而不是用另一種機制來滿足您的需求。它也易於擴展,因此您可以根據自己的需求進行定製。 ASP.NET用戶身份驗證創建加密票證並將其存儲在Cookie中,而不是存儲對服務器端變量的引用:http://support.microsoft.com/kb/910443

我還會提請您注意註冊機制以及如何保護它。特別是

調用SignOut方法只會刪除表單身份驗證Cookie。 Web服務器不存儲有效和過期的身份驗證票據以供以後比較。如果惡意用戶獲得有效的表單身份驗證cookie,這會使您的站點容易受到重播攻擊。

詳情點擊這裏:http://msdn.microsoft.com/en-us/library/system.web.security.formsauthentication.signout.aspx

此外,您可能要設置你的ASP auth cookie"secure" flag,以防止其被泄露通過HTTP一個MITM攻擊。