2013年7月29日 星期一

保護 Cookie 的安全(Secure 與 HttpOnly),在ASP.NET環境

Cookie 的 Secure 屬性是強迫 Cookie 在傳輸時使用 SSL 加密機制。
Cookie 的 HttpOnly 屬性是指示 Cookie 只供瀏覽器與WebServer之間之網頁溝通使用,不允許JavaScript 存取Cookie (document.cookie)。

一、於程式中產生的Cookie,可以利用 HttpOnly 及 Secure 屬性,針對特定的 Cookie 要求
myCookie.HttpOnly = true

myCookie.Secure = true;

二、透過 WebConfig 設定,讓所有的 Cookie 都啟用 Secure:
 ASP.Net 2.0 以後,可以在 WebConfig的 <system.web>區段內加入:
<system.web>
   <httpCookies httpOnlyCookies="true" requireSSL="true" />
   ....
</system.web>

但上面的設定方式,在ASP.Net 1.x 並不支援,所以必須在 Global.asax 中動手腳:
在Global.asax.vb 中加入下面這一段程式 ,強制每一個Cookie 都加入指定的屬性

   Sub Application_EndRequest(ByVal sender As Object, ByVal e As EventArgs)
        ' 於每一個要求開始時引發
        For Each sCookie As String In Response.Cookies
            Response.Cookies(sCookie).Secure = True
            Response.Cookies(sCookie).HttpOnly = True
        Next
    End Sub

三、 Secure HttpOnly 是兩個屬性,請視需要設定(即沒有必須同時都設)

四、雖然完成上面的設定,可以讓應用程式在傳送 Cookies 時加入 Secrure 及 HttpOnly=true 的旗標,但 ASPX 的 SessionCookie (.ASPXAUTH) 卻仍無法以 SSL 傳送,弱點掃描時會發生「Cookie Security: Cookie Not Sent Over SSL」的風險,解決方式是在 中加入 requireSSL="true",如下所示:
<authentication mode="Forms">
  <forms loginUrl="http://mojsingle.moj/mojsingle/script/mojlogin1.asp" timeout="30" protection="All" requireSSL="true" />
</authentication>

-------------------------------------------------------------------------------------------------
緣由:
早期的 ASP.NET 程式最近被黑箱掃描程式找到一項「中風險」項目:
[加密的階段作業 (SSL) Cookie 中遺漏安全屬性]

測試類型:
 應用程式層次測試
威脅分類:
 應用程式隱私測試
原因:
 Web 應用程式會透過 SSL 傳送未受保護的 Cookie
安全風險:
 有可能竊取在加密階段作業期間傳送的使用者和階段作業資訊 (Cookie)
CWE:614
技術說明:
 在應用程式測試期間,偵測到在加密階段作業中,所測試的 Web 應用程式設定了不含 "secure" 屬性的 Cookie。
 由於這個 Cookie 未包含 "secure" 屬性,因此,也可能在未加密的階段作業期間將它傳給網站。

由於此 Cookie 並非我程式中產生的,而是系統為 Session 所建立,為解決此一中風險弱點,只好採用 Global.asax.vb 中加入控制程式的方法因應!

沒有留言:

張貼留言