2010-01-20 228 views
56

我的web應用程序的主頁有一個RememberMe複選框。如果用戶檢查它,我會將cookies存儲在電子郵件地址和密碼中。這是我的代碼:在cookie中存儲密碼是否安全?

if (this.ChkRememberme != null && this.ChkRememberme.Checked == true) 
    { 
    HttpCookie cookie = new HttpCookie(TxtUserName.Text, TxtPassword.Text); 
    cookie.Expires.AddYears(1); 
    Response.Cookies.Add(cookie); 
    } 

我想知道的是:

  • 是否安全存儲密碼的餅乾?
  • 這樣做的正確方法是什麼?
  • 爲cookie設置時間的最佳做法是什麼?
+13

讓FormsAuthentication這樣吧! FormsAuthentication.SetAuthCookie(username,true); – 2010-01-20 11:04:46

回答

57

它不是固定的密碼存儲在cookie中,因爲它們可爲純文本。

找到一些關於cookies的答案的好地方是Cookie Central.對於成員來說,通常會使用一個名爲'token'的長字符串的cookie,當您提供用戶名和密碼時,它會從網站發出。更多關於你可以在這個article中找到的過程。 當使用ASP.NET窗體身份驗證可以設置身份驗證Cookie是這樣的:

FormsAuthentication.SetAuthCookie(userName, isPersistanceCookie); 

第二個參數用於「記住我」的功能 - 如果爲true,將創建一個將持續在你離開後持久Cookie網站。您也可以通過編程操縱餅乾這樣的:

HttpCookie authCookie = 
    HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName]; 
+3

確實。隨時隨地存儲密碼永遠不會安全。只有存儲哈希版本並檢查它。 – 2010-09-21 13:02:15

+5

你甚至不需要散列版本(並避免它,因爲它有自己的風險,例如缺乏鹽)。與用戶標識符沒有數學關係的任意標記就足夠了 - 理解標記的唯一方是您的登錄服務,並且它通過數據庫查找來檢查標記。 – MSalters 2010-09-21 13:45:37

9

這是你應該永遠不會做,因爲這是很容易改變一個cookie的值,併發送回服務器。即使存儲「用戶被作爲'naivists'夾在一個cookie中是錯誤的,因爲我可以將其更改爲」用戶登錄爲'Pandiya Chendur'「。

你能在餅乾做的是客戶端,即使改變了,沒有意義的服務器提供信息。例如 - 最喜歡的顏色,首頁佈局等等。

你可以給予他們存儲在cookie中的會話ID,因爲他們不能做任何事情,更好地爲自己,如果他們的值更改爲別的東西(除非他們知道從另一個會話有效的會話ID)。

什麼微軟的MSDN says about using cookies

使用cookie的安全問題 類似於從 客戶端獲取數據。在您的應用程序中, Cookie是用戶輸入 的另一種形式,因此需要檢查 和欺騙。用戶至少可以通過 查看您在 cookie中存儲的數據,因爲cookie在用戶自己的計算機上可用 。用戶 也可以在 瀏覽器發送給您之前更改cookie。

您不應該將敏感數據 存儲在cookie中,例如用戶名,密碼,信用卡號等 等。不要將任何東西放入cookie 中,這些東西應該不在 用戶的手中,或者某人可能以某種方式盜取cookie。

同樣,如果您懷疑有關 的信息,您將從cookie中獲得信息。 不要認爲數據是 與寫出時的數據相同;使用 與使用Cookie 相同的安全防護措施,您可以將數據與 用戶鍵入到網頁中。該 實例本主題前面顯示 HTML編碼爲您顯示從用戶那裏獲得任何 信息之前,會在一個頁面,顯示 前值一個cookie 的內容。

Cookies是瀏覽器和服務器 爲純文本,誰都誰 可以截取您的Web流量可以 讀取cookie之間發送。只有在連接 使用安全套接字層(SSL)時,您纔可以設置一個cookie 屬性,導致cookie僅爲 。 SSL在用戶的計算機上不保護正在讀取或操作的 的cookie,但它在用戶的計算機上是 ,但它確實在傳輸時阻止了cookie的讀取,因爲該cookie是 加密的。有關更多信息,請參閱 Web 應用程序的基本安全措施。

25

不!不要在Cookie中存儲密碼!

在ASP.NET中,使用

FormsAuthentication.SetAuthCookie(username, true); 

第二個參數的值決定如果cookie是持久性的(該記得我複選框的值)。

0

它一點也不安全。 Cookies存儲在客戶端計算機中,可能會被篡改。

15

不,不是遠程安全的。你有沒有保證,Cookie不採用明文存儲(事實上,大多數實現它們保存爲純文本)。

你要知道,「記住我」本質上是不安全的,因爲任何人都截獲的cookie獲取訪問應用程序。但暴露用戶的密碼使得它更加不安全。 :-)如果他們發現,可能會讓用戶非常生氣。

我用它結合了用戶的帳戶名與令牌是除了在我的服務器上的表與用戶的賬戶相關聯的(其他)方式相結合的加密cookie字符串。當用戶返回該網站時,我們解密該cookie並查找該令牌是否實際上與該帳戶相關聯。令牌(以及cookie)會更改每次自動登錄,並使用於該自動登錄的那個無效。 (有令牌和賬戶之間的多到一的關係,允許從多個位置自動登錄,你可以限制,如果你喜歡。),如果他們沒有在X天內使用令牌超時。 (這不僅通過限制cookie的持續時間來完成;它也完成了服務器端。)還有一些其他的東西我扔在那裏,使生活難以嘗試解碼cookie(已成功解密它)或使用被盜的cookie(不需要解密)的人的,但沒有意義在過度殺傷(再次,「記住我」本質上是不安全的)。

我在強健的安全並非真正必要(顯然)並且擁有大量動態IP客戶端的站點上使用它,所以我不會嘗試將其鎖定到IP。但即使將其鎖定到IP也不能保證安全,它只是減少了攻擊面。

您可能想知道爲什麼我在cookie中擁有用戶名。對於直接「記住我」的目的,即使它被加密(畢竟,它是用戶名+密碼系統中的認證對的一半),我也不會建議它在那裏。當我提醒自己我們是如何爲這個問題做了這件事的時候,當我看到格式時,我有點驚訝地發現它在我們的cookie中;但後來我看到了解釋爲什麼它在那裏的意見,並且有與「記住我」無關的原因(事後回想起來,原因不一定是有說服力的原因)。

最後一點,「記住我」本質上是不安全的事實是站點日誌非常重要的原因之一,以及爲什麼在允許更改重要帳戶信息的過程中需要密碼重新驗證使竊取cookie的人更難以掌握該賬戶的所有權)。

+0

每次登錄時更改的令牌都將禁止從不同位置(「家庭」和「工作」)或不同瀏覽器自動登錄到同一帳戶。 – 2010-01-20 10:12:05

+0

@Hans:僅當您只允許每個帳戶使用一個令牌時。如果允許令牌和用戶帳戶之間存在多對一關係(我通過令牌表),則用戶可以有多個自動登錄活動。我會更新答案,使其更清晰並提及超時。 – 2010-01-20 10:31:28

2

將密碼存儲在cookie中並不安全,因爲它們可以以純文本格式提供。 但是,如果您的首選標準是這樣做或任何用戶要求在那裏,你可以通過加密字符串來做到這一點。這可以使這個安全。

,但不建議這樣做,

2

我認爲你需要創建用戶名令牌和加密認證字符串你從窗戶身份得到。無需在cookie上存儲密碼。我們有我們的應用程序存儲用戶名和認證字符串

2

順便說一句,存儲密碼是不安全的,無論是客戶端和服務器端。

你不需要那樣做。

-2
  • 如果使用SSL,你應該,如果你發送的任何安全信息,消除第三方不會聽你的網絡流量。無論將用戶憑據存儲在cookie中,這都會是同樣的問題,因爲無論如何他們都會將用戶名和密碼發送到服務器,我假設服務器將其散列並將其與您爲該用戶擁有的散列密碼進行比較。

  • 其他域名將永遠無法讀取您的Cookie,因爲它是跨域的,所以這不是問題。

  • 所以真的是唯一的「安全漏洞」,如果你想調用它,就是如果有人在物理上獲得訪問他們的計算機。如果發生這種情況,他們最有可能得到任何想要從那個人那裏得到的信息。你如何解釋什麼時候chrome auto會爲你填寫登錄表單,這是否安全?我相信他們不是以純文本的形式存儲它,但這並不重要。如果您訪問的是Chrome自動填充的頁面,則可以將密碼從表單中複製出來,然後查看您現在擁有該人員的密碼。

  • 這真的歸結爲您需要它的「安全」程度。我同意以過期作爲令牌加密用戶信息是驗證服務調用的最佳方式,並提供了靈活性。我只是沒有看到在cookie中存儲登錄憑證的問題。

相關問題