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
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 值時採用的安全措施應該與處理 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 及其安全弱點的資訊。
第一個頁面的代碼如下:
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
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