2010-06-16 97 views
1

我正在開發將當前用戶和用戶角色存儲到會話狀態(System.Web.SessionState.HttpSessionState Page.Session)的應用程序。XSS更改ASP.NET會話狀態

 if (Session["username"] == null) 
      Session.Add("username", User.Identity.Name); 

     if (Session["isAdministrator"] == null) 
      Session.Add("isAdministrator", User.IsInRole(domain + "\\Domain Admins")); 

後,我在代碼檢查這些會話狀態的背後授予許可給一些excecution:

if ((bool)Session["isAdministrator"] || computer.Administrators.Contains(Session["username"].ToString())) 

我的問題是下一步:如何安全的這種機制是什麼?是否有可能改變會話狀態使用一些JavaScript例如或其他一些?

謝謝:)

回答

1

由於狀態只存儲在服務器上,因此無法使用javascript或其他客戶端機制更改會話狀態。但正如其他人所指出的那樣,惡意用戶可能通過獲取會話cookie的內容來劫持會話。

ASP.NET在設計時考慮到了這一弱點 - 會話ID適當長且難以預測。此外,會話cookie被標記爲HTTP ONLY,這意味着大多數現代瀏覽器將不允許JavaScript代碼訪問它。

0

一般而言,我會說這是非常安全的XSS攻擊。 ASP.Net默認根據包含用戶會話ID的Cookie跟蹤用戶會話。如果你打開你的瀏覽器cookie列表並從你的站點尋找,你會看到這個,那裏會有一個名爲ASP.Net Session的東西...... SessionID是唯一的,而不是增量式的。可能有一些GUID的差異。

爲了增加安全性,您還可以在web.config中指定保持用戶會話存活的時間。如果您正在處理敏感信息,則可能需要將此超時設置爲相對較短的時間段,可能是10分鐘的不活動時間,默認值爲20分鐘。你可以找到更多信息@http://msdn.microsoft.com/en-us/library/system.web.sessionstate.httpsessionstate.timeout.aspx

<system.web> 
    <sessionState timeout="10" /> 
</system.web> 

--Peter

2

如果User.Identity.Name設置,爲什麼你需要把它放在Session?你爲什麼不直接致電User.IsInRole(domain + "\\Domain Admins")(或者把它包裝在幫手裏)?它看起來像我使用Windows身份驗證,因此在會話中設置用戶名是多餘的。

對於您的XSS問題,會話會將會話ID存儲在cookie中,因此從理論上說,攻擊者可能會嗅探HTTP流量或向您的頁面注入JavaScript代碼,獲取Cookie,然後使用它並冒充另一個用戶。

+0

是的,謝謝。我認爲最好直接比較User.Identity.Name而不是會話狀態值。 – 2010-06-16 18:24:37