如何查看 ASP 代码 CSSI 漏洞

文章翻译 文章翻译
文章编号: 253119 - 查看本文应用于的产品
展开全部 | 关闭全部

概要

本文介绍了如何识别和正确的活动服务器页面 (ASP) 应用程序到跨站点脚本安全问题 (CSSI) 容易受影响。不能正确验证或格式设置的唯一输入使应用程序容易受到攻击。

更多信息

以下步骤可以帮助您识别和纠正的 ASP 应用程序容易受到 CSSI:
  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 预防。

    请注意当筛选或编码,您需要指定设置的 Web 页以确保您的筛选器正在检查适当的特殊字符的字符。数据插入到您的 Web 页应该筛选出被视为特殊基于特定的字符集 (字符集) 的字节序列。受欢迎的字符集是 ISO 8859-1,这是默认值的 HTML 和 HTTP 早期版本中。当您更改这些参数时,您必须考虑到帐户本地化问题。
    • 使用 HTMLEncode 方法生成显示时进行编码的输入的参数。

      一般情况下,可防止大多数 CSSI 攻击,只需通过 HTMLEncode 上输入参数。通过替换在 HTML 为 HTML 变量代表这些字符 ; 中具有特殊含义的字符使用 HTMLEncode 工作 (例如对于 &amp; = &amp;,"=")。请注意,只有数据需要进行编码,和 $ 不完整的字符串。
      <% 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。

      URLEncode 方法应用 URL 编码包括到指定的字符串的转义字符的规则。您应该对传入的 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) 卡耐基-梅隆大学:
http://www.cert.org/advisories/CA-2000-02.html
有关更多的信息请单击下面文章编号,以查看 Microsoft 知识库中相应的文章:
252985如何防止跨站点脚本安全问题的 Web 应用程序
253121如何审阅 MTS/ASP 代码 CSSI 漏洞
253120如何审阅 Visual InterDev 生成 CSSI 漏洞的代码
253117如何阻止 Internet Explorer 和 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
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 253119
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。
不再更新的 KB 内容免责声明
本文介绍那些 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