Microsoft提供了一个免费的Anti-XSS库,这个库扩展了内置的编码方法,并为HTML特性、JavaScript、XML等提供附加的输出类型。每个输出类型(或上下文)的编码规则是不同的,由您来为内容选择合适的输出上下文。Anti-XSS库以"白名单"为工作方式,使用超过12种语言来定义一个有效的字符列表(与"黑名单"方法相比,黑名单定义了一个无效的字符、代码和命令列表)。由于Anti-XSS库包含了(已经内置到架构中)最新、更健壮的HtmlEncode和UrlEncode函数的版本,因此应该使用Anti-XSS版本。
注意:可以从http://www.codeplex.com/antixss网站下载Anti-XSS库,如果您不想要检查代码并自己编译它,那么这个名为codeplex的网站还包含二进制下载的链接。
表3-2显示了Anti-XSS库支持的编码方式。
表3-2 Microsoft Anti-XSS库支持的编码方式
编 码 方 式 | 用 法 |
HtmlEncode | 当不受信任的输入被指派到HTML 输出时使用该编码方式,除了把该输 入指派到HTML特性情况之外 |
HtmlAttributeEncode | 当不受信任的输入被指派到HTML 特性(例如,id、name、width 或height) 时使用该编码方式 |
JavaScriptEncode | 当在JavaScript中使用不受信任的输入 时使用该编码方式 |
UrlEncode | 当使用不受信任的输入来产生一个UR L(或者在一个URL内使用)时使用该编码方式 |
VisualBasicScriptEncode | 当在VBScript中使用不受信任的输入时 使用该编码方式 |
XmlEncode | 当不受信任的输入被指派到XML输出, 除非是指派到XML特性时使用该编码方式 |
XmlAttributeEncode | 当不受信任的输入被指派到XML特 性时使用该编码方式 |
安全的运行时引擎
Anti-XSS库还包括安全运行时引擎(Security Run-time Engine,SRE)和HTTP模块,SRE和HTTP模块通过XSS库自动和主动编码数据来保护您的ASP.NET应用程序,其工作方式是分析Web应用程序和检查每一个ASP.NET Web控件或继承自这些控件派生的控件,通过antixssmodule.config文件指定应用到该控件属性的编码方式来配置模块。
SRE包含一个称为SRE Configuration Generation(SRE配置生成器)的实用工具,如图3-4所示。此实用工具分析Web应用程序和应用程序中使用的控件。由此可见,SRE决定每一个属性的编码方法,并产生一个称为antixssmodule.config的配置文件。由于此生成器分析编译后的Web站点,因此必须使用Visual Studio的Web应用程序项目,而不是使用Visual Studio的Web站点功能。
图3-4 SRE的配置生成器工具 |
通过以下几个步骤来启用SRE:
(1) 使用配置生成器工具分析Web应用程序项目,并生成一个配置文件,该配置文件必须被复制到Web应用程序根目录中。此配置工具检查在编译Web应用程序时产生的程序集。如果您使用的是Visual Studio的Web站点方式,因为没有编译阶段,所以不产生程序集。在这种情况下,可以使用提供的默认配置文件,但只能提供对标准的ASP.NET控件的保护,不能保护任何自定义的控件。
(2) 把SER运行时DLL从Security Runtime Engine\Module文件夹中复制到自己的应用程序的\bin文件夹下。
(3) 通过编辑web.config文件来启用SER运行时。如果您正以经典的ASP.NET模式使用IIS 6或者IIS 7,那么把下面内容添加到system.web节的<httpModules>列表中。如果您使用的是集成管道模式的IIS 7,那么把下面的内容添加到system.webmodules节的<modules>列表中。
通过配置文件可以把一些页面或者个别的控件从SRE中排除出去,或者在代码中把SupressAntiXssEncoding特性应用到页面或者控件,如下所示:
- <add name="AntiXssModule" type=
- "Microsoft.Security.Application.SecurityRuntimeEngine.AntiXssModule"/>
警告:SRE不能保护任何通过Response.Write方法或使用
- [Microsoft.Security.Application.SecurityRuntimeEngine
- .SupressAntiXssEncoding()]
- public partial class _Default : System.Web.UI.Page
- {
- protected void Page_Load(object sender, EventArgs e)
- {
- ...
- }
- }