ASP.NET中Cookie編程的基礎知識(6)

來源:互聯網
上載者:User
asp.net|cookie|編程 刪除 Cookie

  刪除 Cookie(即把該 Cookie 從使用者的硬碟上物理刪除)是修改 Cookie 的一種形式。由於 Cookie 位於使用者的電腦中,所以您無法直接將其刪除。但是,您可以讓瀏覽器為您刪除 Cookie。修改 Cookie 的方法前面已經介紹過(即用相同的名稱建立一個新的 Cookie),不同的是將其有效期間設定為過去的某個日期。當瀏覽器檢查 Cookie 的有效期間時,就會刪除這個已到期的 Cookie。

  所以,刪除 Cookie 的方法與建立該 Cookie 的方法是相同的,只不過要把其有效期間設定為過去的某個日期。以下樣本比刪除單個 Cookie 要稍微有趣一些,它使用的方法可以刪除當前域的所有 Cookie:

Dim i As Integer
Dim cookieName As String
Dim limit As Integer = Request.Cookies.Count - 1
For i = 0 To limit
aCookie = Request.Cookies(i)
aCookie.Expires = DateTime.Now.AddDays(-1)
Response.Cookies.Add(aCookie)
Next

  修改或刪除子鍵

  修改單個子鍵的方法與最初建立它的方法相同:

Response.Cookies("userInfo")("lastVisit") = DateTime.Now.ToString
Response.Cookies("userInfo").Expires = DateTime.Now.AddDays(1)

  比較複雜的問題是如何刪除單個子鍵。您不能只是簡單地重新設定 Cookie 的到期日期,因為這樣只能刪除整個 Cookie 而不能刪除單個子鍵。實際的解決方案是對包含子鍵的 Cookie 的 Values 集合進行操作。首先,通過從 Request.Cookies 對象中擷取 Cookie 來重新建立 Cookie。然後,您就可以調用 Values 集合的 Remove 方法,將要刪除的子鍵名稱傳遞到 Remove 方法。接下來,您通常可以將修改後的 Cookie 添加到 Response.Cookies 集合,以便將修改後的 Cookie 發送回瀏覽器。

  以下代碼顯示了如何刪除子鍵。在樣本中,要刪除的子鍵的名稱在變數中指定。

Dim subkeyName As String
subkeyName = "userName"
Dim aCookie As HttpCookie = Request.Cookies("userInfo")
aCookie.Values.Remove(subkeyName)
aCookie.Expires = DateTime.Now.AddDays(1)
Response.Cookies.Add(aCookie)

  Cookie 與安全性

  在使用 Cookie 時,您必須意識到其固有的安全弱點。我所指的安全性並不是隱私問題,正如我在前面的什麼是 Cookie?中所述,隱私在更大程度上是某些使用者面對的問題:這些使用者很關心 Cookie 中的資訊是如何被使用的。而 Cookie 的安全性問題與從客戶機擷取資料的安全性問題類似。對於初學者,就應用程式而言,Cookie 是使用者輸入的另一種形式,因而很容易被他人非法擷取和利用。由於 Cookie 儲存在使用者自己的電腦上,所以使用者至少可以看到您儲存在 Cookie 中的資訊。如果使用者願意,還能在瀏覽器向您發送 Cookie 之前修改該 Cookie。

  所以,您千萬不要在 Cookie 中儲存保密資訊 - 使用者名稱、密碼、信用卡號等等。在 Cookie 中不要儲存不應該由使用者掌握的內容,也不要儲存可能被其他竊取 Cookie 的人控制的內容。

  同樣,要對從 Cookie 中得到的任何資訊都持懷疑態度。不要認為得到的資料就是您當初設想的資訊。處理 Cookie 值時採用的安全措施應該與處理 Web 頁面中使用者鍵入的資料時採用的安全措施相同。例如,在頁面中顯示值之前,我會對 Cookie 中的內容進行 HTML 編碼。這是一種標準的方法,可以在顯示之前淨化從使用者處得到的資訊,對 Cookie 的處理與此相同。

  另一個需要關心的問題是,Cookie 是以純文字的形式在瀏覽器和伺服器之間傳送的,任何可以截取 Web 通訊的人都可以讀取 Cookie。您可以對 Cookie 的屬性進行設定,使其只能在使用安全通訊端層(SSL,又稱 https://)的串連上傳輸。SSL 並不能防止儲存在使用者電腦上的 Cookie 被他人讀取或操作,但它能防止 Cookie 在傳輸途中被他人截取。本文不討論 SSL,但您必須清楚,您可以對 Cookie 進行傳輸保護。有關 SSL 的詳細資料,請參閱 Secure Sockets Layer: Protect Your E-Commerce Web Site with SSL and Digital Certificates(英文)。

  面對這些安全問題,如何才能安全地使用 Cookie?您可以在 Cookie 中儲存一些不重要的資料,如使用者喜好設定或其他對應用程式沒有重大影響的資訊。如果確實需要把某些敏感資訊(如使用者識別碼)儲存在 Cookie 中,就對這些資訊進行加密。一種可行的方法是利用 ASP.NET Forms Authentication 公用程式建立一個身分識別驗證票據,作為 Cookie 儲存。本文不討論有關加密的問題,但是,如果您需要在 Cookie 中儲存敏感資訊,就應該試著採取措施來隱藏資訊,防止被他人盜用。

  在 Mitigating Cross-site Scripting With HTTP-only Cookies(英文)一文中,您可以瞭解到更多有關 Cookie 及其安全弱點的資訊。

  檢查瀏覽器是否接受 Cookie

  我在前面的 Cookie 的限制一節中曾經提到一個潛在問題,即使用者可以設定自己的瀏覽器拒絕接受 Cookie。如何才能知道您是否可以讀寫 Cookie?在不能寫入 Cookie 時不會出現任何錯誤(例如 Response.Cookies 不會拋出異常),因為伺服器並不跟蹤呈現頁面後出現的情況。瀏覽器同樣不會向伺服器發送任何有關其當前的 Cookie 設定的資訊。(也許您需要瞭解,但 HttpBrowserCapabilities.Cookies Property [英文] 屬性並不會告訴您 Cookie 是否被啟用,而只能告訴您當前的瀏覽器是否支援 Cookie。)

  一種確定瀏覽器是否接受 Cookie 的方法是先編寫一個 Cookie,然後再嘗試讀取這個 Cookie。如果不能讀取這個 Cookie,則可以認為該瀏覽器不接受 Cookie。

  我編寫了一個簡單的樣本來說明如何測試 Cookie 是否被接受。該樣本包含兩個頁面。在第一個頁面中,我編寫了一個 Cookie,然後把瀏覽器重新定向到第二個頁面。第二個頁面嘗試讀取這個 Cookie,轉而將瀏覽器重新定向到第一個頁面,並向 URL 添加一個帶有測試結果的查詢字串變數。

  第一個頁面的代碼如下:
Sub Page_Load()
If Not Page.IsPostBack Then
If Request.QueryString("AcceptsCookies") Is Nothing Then
Response.Cookies("TestCookie").Value = "ok"
Response.Cookies("TestCookie").Expires = _
DateTime.Now.AddMinutes(1)
Response.Redirect("TestForCookies.aspx?redirect=" & _
Server.UrlEncode(Request.Url.ToString))
Else
labelAcceptsCookies.Text = "接受 Cookie = " & _
Request.QueryString("AcceptsCookies")
End If
End If
End Sub

  第一個頁面測試是否有回信,如果沒有,就搜尋包含測試結果的查詢字串變數 (AcceptsCookies)。如果沒有找到查詢字串變數,則表示測試還沒有完成,代碼就寫出一個名為“TestCookie”的 Cookie。寫出 Cookie 之後,樣本調用 Response.Redirect 來切換到測試頁面 (TestForCookies.aspx)。附加到測試頁面的 URL 的是名為 redirect 的查詢字串變數,該變數中包含了當前頁面的 URL,這樣就能在執行測試後把重新導向到該頁面。

  測試頁面可以完全由程式碼群組成,不需要包含控制項。以下就是我使用的代碼:

Sub Page_Load()
Dim redirect As String = Request.QueryString("redirect")
Dim acceptsCookies As String
' 是否接受 Cookie?
If Request.Cookies("TestCookie") Is Nothing Then
' 沒有 Cookie,因此不需要接受
acceptsCookies = 0
Else
acceptsCookies = 1
' 刪除測試 Cookie
Response.Cookies("TestCookie").Expires = _
DateTime.Now.AddDays(-1)
End If
Response.Redirect(redirect & "?AcceptsCookies=" & acceptsCookies, _
True)
End Sub


  讀取 redirect 查詢字串變數後,代碼就嘗試讀取 Cookie。為了實現日常管理,如果該 Cookie 確實存在,就會被立即刪除。測試完成後,代碼從 redirect 查詢字串變數傳遞的 URL 構造一個新的 URL。新的 URL 也包括一個包含測試結果的查詢字串變數。最後一步是使用新的 URL 將瀏覽器重新導向到原來的頁面。

  這個樣本十分簡單,但說明了通過運行程式並查看結果來進行測試的基本原則。其中最需要改進的地方是要永久儲存 Cookie 測試結果,這樣使用者就不必在每次瀏覽原始頁面時都重複進行測試。但是,實際上並不能做到這一點。Cookie 不會起作用,原因是顯而易見的。另一種可能是把測試結果儲存在工作階段狀態中,但在預設情況下,工作階段狀態也依賴於 Cookie,而如果瀏覽器不接受 Cookie,工作階段狀態也不會起作用。解決後一個問題的辦法是採用無 Cookie 的工作階段狀態。下一節我將簡要介紹工作階段狀態如何與 Cookie 協作。

  Cookie 和工作階段狀態

  當使用者訪問您的網站時,伺服器會為該使用者建立唯一的會話,會話將一直延續到使用者訪問結束。對於每個會話,ASP.NET 都維護一種基於伺服器的結構(工作階段狀態),在該結構中應用程式可以儲存使用者的相關資訊。有關詳細資料,請參閱 Session State(英文)。

  ASP.NET 需要能跟蹤每個使用者的會話 ID,這樣才能把使用者映射到伺服器上的工作階段狀態資訊。預設情況下,ASP.NET 使用一個非永久性的 Cookie 來儲存工作階段狀態。如果您使用讀取 Cookie 一節的“讀取 Cookie 集合”中的樣本,您可能就會在 Cookie 中發現一個工作階段狀態 Cookie。

  但是如果使用者禁用了瀏覽器的 Cookie,工作階段狀態就不能使用 Cookie 來儲存會話 ID,工作階段狀態也不會起作用。這就是為什麼我在前面的檢查瀏覽器是否接受 Cookie 中說,無法在 Cookie 測試完畢後把測試結果實際儲存在工作階段狀態中,因為沒有 Cookie 就沒有工作階段狀態。

  ASP.NET 提供了一種解決方案,即利用無 Cookie 的會話。您可以配置自己的應用程式,不在 Cookie 中儲存會話 ID,而是在網站頁面的 URL 中儲存。會話 ID 儲存在 URL 中,也就是 ASP.NET 將 ID 儲存在瀏覽器中,從而能夠在使用者請求其他頁面時取回 ID。

  無 Cookie 會話可以避免瀏覽器拒絕 Cookie 的問題,使您能夠使用工作階段狀態。如果您的應用程式依賴於工作階段狀態,您可能就需要對其進行配置,使它能使用無 Cookie 會話。但是,在某些情況下,如果使用者與其他人共用 URL - 可能是使用者通過電子郵件將 URL 發送給同事,而該使用者的會話仍然處於啟用狀態 - 那麼最終這兩個使用者可能共用同一個會話,結果將難以預料。


相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。