2013-06-03 49 views
0

我在logon.aspx.cs中創建了一些cookie,該代碼隱藏了thatc從數據讀取器讀取幷包含來自數據庫的用戶信息。我無法在主頁或其他頁面上讀取cookie

HttpCookie UID = new HttpCookie("ID"); 
Response.Cookies["UID"].Value = Recordset[0].ToString(); 
Response.Cookies.Add(UID); 
HttpCookie UName = new HttpCookie("Username"); 
Response.Cookies["Username"].Value = Recordset[3].ToString(); 
Response.Cookies.Add(UName); 
HttpCookie Pass = new HttpCookie("Pass"); 
Response.Cookies["Pass"].Value = Recordset[4].ToString(); 
Response.Cookies.Add(Pass); 
HttpCookie Admins = new HttpCookie("Admin"); 
Response.Cookies["Admin"].Value = Recordset[12].ToString(); 
Response.Cookies.Add(Admins); 
HttpCookie Mails = new HttpCookie("Emails"); 
Response.Cookies["Emails"].Value = Recordset[9].ToString(); 
Response.Cookies.Add(Mails); 
Response.Redirect("../default.aspx"); 

當我跟蹤代碼每一件事情是好的,數據由餅乾舉行。
現在,當我在母版頁或其他內容頁面閱讀這些cookie時,我不能。
在其它世界的餅乾不是他們的名字(或鑰匙)

if (Request.Cookies["Username"] !=null) 
{ 
    lblWelcomeUser.Text = Server.HtmlEncode(Request.Cookies["Username"].Value); 
    pnlUsersNavigation.Visible = true; 
    LoginMenu.Visible = false; 
    RegisterMenu.Visible = false; 
    lblWelcomeUser.Text = Server.HtmlEncode(Request.Cookies["Username"].Value); 
    //lblWelcomeUser.Text = Request.Cookies["Username"].Value.ToString(); 
    if (Request.Cookies["Admin"].Value.ToString()=="True") 
    { 
     lblWelcomeUser.Text = "WELCOME ADMIN"; 
     // Show Menu that is only for Admin 
    } 

哪裏是在這段代碼的問題認識?

+0

請注意[中間人](http://en.wikipedia.org/wiki/Man-in-the-middle_attack)攻擊。 –

+0

@ChrisGessler:好的,那麼有什麼方法是有用的?你是否指ASP.NET的成員?如果我使用它,我可以更改其控件的設計嗎?例如登錄控制。我可以將其簡單設計更改爲我的自定義設計?我希望能夠清楚地說出我的想法! –

+0

cookie值不安全(即加密),所以如果我想要,我可以通過編輯cookie並重新提交我的請求來更改我的管理員狀態。它還會讓用戶陷入各種形式的「會話劫持」。 –

回答

1

看來您可能會用一個很好的值覆蓋cookie,並使用一個新的空cookie。

// new cookie created - empty 
HttpCookie UName = new HttpCookie("Username"); 

// new cookie created with a value 
Response.Cookies["Username"].Value = Recordset[3].ToString(); 

// overwrite new cookie with value with new empty cookie 
Response.Cookies.Add(UName); 

創建cookie,設置值,然後將cookie添加到響應中。

HttpCookie UName = new HttpCookie("Username"); 
UName.Value = Recordset[3].ToString(); 
Response.Cookies.Add(UName); 

另請注意,正如Paul Grimshaw指出的那樣,您可以將多個值添加到同一個cookie中。

下載Fiddler檢查請求/響應,以確保您的cookie包含正確的價值觀和這樣... http://fiddler2.com/get-fiddler

另外要小心Man-in-the-middle攻擊。以純文本存儲用戶名和密碼並不是一個好主意。

+0

:哎呀!我不知道這個,也許我的項目會破解!你用你的理由說服我。現在我有兩個問題:1-如果我在同一個cookie中使用多個值,是否更安全? 2-如果我使用默認的asp.net控件,我可以改變它們的設計嗎?如果我給出這2個答案,我可以做出更好的決定。謝謝 –

+0

1.不,它們仍然是純文本,可以被任何有權訪問機器的人閱讀和操作。 2.我相信Microsoft自帶的ASP.NET登錄控件可以自定義。看看使用表單身份驗證。 –

+0

謝謝你的信息,教我!我接受你的答案是因爲你更清楚地解釋了答案,併爲Paul Grimshaw提出了關於多重Cookie的想法投票。我從35個小時前沒有睡覺以找到我的答案!謝謝。 –

1

這看起來並不像一種安全訪問應用程序的安全方式。嘗試看看ASP.NET membership

否則請嘗試設置到期日期。此外,如本例所示,您可能需要存儲所有上述信息在一個cookie中:

HttpCookie myCookie = new HttpCookie("UserSettings"); 
myCookie["UID"] = Recordset[0].ToString(); 
myCookie["Username"] = Recordset[3].ToString(); 
//...etc... 
myCookie.Expires = DateTime.Now.AddDays(1); 
Response.Cookies.Add(myCookie); 

此外,from MSDN

默認情況下,餅乾是由在所有頁面共享相同的 域,但您可以通過設置其路徑屬性將Cookie限制到網站 中的特定子文件夾。要允許通過 應用程序的所有文件夾中的所有頁面檢索cookie,請從 位於應用程序的根文件夾中的頁面進行設置,並且不要設置路徑 屬性。如果您未指定cookie的到期限制,則 cookie不會持久保存到客戶端計算機,並且在用戶會話到期時 到期。 Cookies只能存儲 字符串的值。您必須先將任何非字符串值轉換爲字符串,然後才能將它們存儲在Cookie中。對於許多數據類型,調用ToString 方法就足夠了。有關更多信息,請參閱要保留的數據類型的ToString方法 。

+0

多少編輯! ;) –

相關問題