如何檢閱 CSSI 弱點的 ASP 程式碼

文章翻譯 文章翻譯
文章編號: 253119 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

結論

本文將告訴您,如何識別和正確是很容易受到至跨網站指令碼處理安全性議題 (CSSI) 的動態伺服器網頁 (ASP) 應用程式。不正確地驗證或格式化的唯一輸入讓應用程式容易受到攻擊。

其他相關資訊

下列步驟可協助您找出並更正容易遭到 CSSI 的 ASP 應用程式:
  1. 尋找會產生要顯示的 HTML 的 ASP 程式碼。ASP 將 HTML 寫入至輸出兩種方式:
    Response.Write
    					
    -以及-
    <% =
    					
  2. 找出 HTML 輸出是否包含輸入的參數。這些參數可能來自各種來源。下列清單包含常見的輸入的來源:

    摺疊此表格展開此表格
    輸入的來源ASP 程式碼存取方法的範例
    Request.Form 集合
    Response.Write Request.Form("username")
    									
    Request.QueryString 集合
    <%=Request.QueryString("username")%>
    									
    Response.Write Request.QueryString("username")
    									
    <a href="http://mysite/showuser.asp?username=<% = 
    Request.QueryString("username") %>">mypage</a>
    									
    <a href="http://mysite/mypage.asp"><%=Request.QueryString("url")%></a>
    									
    要求物件
    Response.Write("username")
    									
    資料庫 / 資料存取方法
    Do While Not rst.EOF
    	Response.Write rst("myfield") & "<br>"
    	rst.MoveNext
    Loop
    									
    Cookie 集合
    Response.Write Request.Cookie("username")
    									
    工作階段和應用程式變數
    Response.Write Session("username")
    									
  3. 當您發現會產生使用某些輸入 HTML 的 ASP 程式碼時,您必須評估應用程式特定的解決方案。下面的解決方案呈現某些一般的概念來幫助您開始 CSSI 預防。

    請注意篩選或編碼時, 需要指定設定為您的網頁,以確保您的篩選條件檢查適當的特殊字元的字元。資料插入到您的網頁應該篩選出會被視為特殊根據特定字元組 (字元集) 的位元組序列。受歡迎的字集為 ISO 8859-1,也就是 HTML 和 HTTP 的早期版本中預設值。當您變更這些參數時,您必須考慮到帳戶當地語系化問題。
    • 使用 HTMLEncode 方法來產生顯示時進行編碼的輸入的參數。

      在一般大部分 CSSI 攻擊可防止只要使用 HTMLEncode 上輸入參數。使用 HTMLEncode 的運作方式來取代 HTML 以 HTML 變數代表這些的字元 ; 中具有特殊意義的字元 (比方說 & = &,"=")。請請注意,只有資料需要進行編碼和不完整的字串。
      <% Response.Write("Hello visitor <I>" +
            Server.HTMLEncode(Request.Form("UserName")) +
            "</I>");
      %> 
      						
    • HTTP_REFERER 可以用來限制可以提出要求的網域。

      HTTP_REFERER 傳回字串,包含原始要求的 URL,重新導向已發生時。Web 伺服器可以檢查參考欄位,當他們收到填寫的表單,並拒絕如果它不是來自正確的位置。您可以以下列方式檢查 [HTTP_REFERER:
         <%
         If (Request.ServerVariables("HTTP_REFERER") = "") Or _
            (Left(Request.ServerVariables("HTTP_REFERER"),42) <> _
            "http://www.myserver.com/AppDir/mainfrm.asp") Then
            Response.Redirect "http://www.myserver.com/AppDir/mainfrm.asp"
         End If
         %> 
      							
      注意: 參考欄位有一些限制:
      • 您的風險封鎖合法的表單送出資料。
      • 此連結可能來自電子郵件或沒有 URL 的書籤。
      • 故意瀏覽器就可能會參考] 欄位清除例如 HTTPS 要求期間。
    • 使用 URLEncode 編碼為輸入參數接收到的 URL。

      URL 編碼方式包括到指定的字串的逸出字元的規則套用 URLEncode 方法。您應該對傳入的 URL 顯示它們之前進行編碼。以下是 URLEncode 的範例:
      <%
            var BaseURL = http://www.mysite.com/search2.asp?searchagain=;
            Response.write("<a href=\"" + BaseUrl +
            Server.URLEncode(Request.QueryString("SearchString")) +
            "\">click-me</a>");
      %>
      						
    • 刪除或修改從輸入參數的特殊字元。特殊字元包括下列:
      < > " ' % ; ) ( & +
      							
      您可以刪除或修改的字元,當您讀取它們在中或在顯示它們至瀏覽器根據您的應用程式時。

      這個範例使用 JavaScript 篩選特殊字元:
      function RemoveBad(strTemp) { 
      	strTemp = strTemp.replace(/\<|\>|\"|\'|\%|\;|\(|\)|\&|\+|\-/g,""); 
      return strTemp;
      } 
      							
      這個範例使用 Visual Basic 指令碼版本 5.0 版規則運算式來篩選特殊字元:
      Function ValidateTags(QueryString)
      	Dim o
      	Set o = CreateObject("VBScript.RegExp") ' -> VB Script 5.0
      
      	Dim sBad
      
      	sBad = "(<\s*(script|object|applet|embed|form)\s*>)"   ' <  script xxx >
      	sbad = sbad & "|" & "(<.*>)"
                   ' >xxxxx<  warning includes hyperlinks and stuff between > and <
      	sbad = sbad & "|" & "(&.{1,5};)"   ' &xxxx;
      	sbad = sbad & "|" & "eval\s*\("    ' eval  ( 
       	sbad = sbad & "|" & "(event\s*=)"  ' event  =
      	
      	'Now lets check for encoding
      	sbad = Replace(sbad,"<", "(<|%60|<)")
      	sbad = Replace(sbad,">", "(>|%62|>)")
      	
      	o.IgnoreCase = True 'ignore case of string
      	o.Global =False 'stop on first hit
      
      	o.Pattern = sBad
      
      	ValidateTags = o.Test(QueryString)
      
      	Set o = Nothing
      End Function
      						

?考

如需詳細資訊,請參閱下列摘要報告從該電腦緊急回應小組 (CERT) 在 Carnegie 產品大學]:
http://www.cert.org/advisories/CA-2000-02.html
如需詳細資訊按一下面的文件編號,檢視 「 Microsoft 知識庫 」 中 「 文件:
252985如何避免跨網站指令碼處理安全性問題的 Web 應用程式
253121如何檢閱 CSSI 弱點的 MTS/ASP 程式碼
253120如何檢視 [Visual InterDev 產生 CSSI 弱點的程式碼
253117如何防止網際網路檔案總管] 及 [Outlook Express CSSI 弱點
Microsoft 提供協力廠商連絡資訊可協助您尋找技術支援。此連絡人資訊若有變更恕不另行通知。Microsoft 不保證此第三方連絡資訊的正確性。

屬性

文章編號: 253119 - 上次校閱: 2005年7月8日 - 版次: 1.3
這篇文章中的資訊適用於:
  • Microsoft Active Server Pages 4.0
關鍵字:?
kbmt kbcodesnippet kbcssi kbhowto kbsecurity kbsecvulnerability KB253119 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:253119
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。
依現狀不再更新的知識庫內容免責聲明
本文旨在說明 Microsoft 不再提供支援的產品。因此,本文係依「現狀」提供,不會再更新。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com