保证标准控件的安全

更新:2007 年 11 月

ASP.NET 标准控件是一组用于创建窗体的控件,在页面发回到服务器之前,用户可在这些窗体中键入或选择信息。标准控件是从 Control 类继承的 Web 服务器控件。Web 服务器的示例包括 TextBoxImageAdRotator 控件。本主题中的信息描述配置和编码最佳实践,它们将帮助您提高标准控件的安全性。

尽管下面的编码和配置最佳实践可以帮助提高应用程序的安全性,但还要注意不断用 Microsoft Windows 和 Internet 信息服务 (IIS) 最新的安全更新以及 Microsoft SQL Server 或其他数据源的任何安全更新,使应用程序服务器保持最新。

有关编写安全代码和保护应用程序的最佳实践的更详细信息,请参见 Michael Howard 和 David LeBlanc 合著的 Writing Secure Code(《编写安全代码》)一书,也可以参见 Microsoft Patterns and Practices”(Microsoft 模式与操作) 中提供的指南。

此外,下面的主题还介绍了有关其他类型控件的特殊安全实践的信息:

AdRotator 控件

AdRotator 控件显示广告文件(在默认情况下是 XML 文件)中定义的广告。或者,可以将广告存储在数据库中并以编程方式提取它们。若要帮助保护 AdRotator 控件,请遵循以下准则:

  • 如果您使用某个 XML 文件来存储广告信息,请将该文件放在网站的 App_Data 文件夹中,这是由于该文件夹的内容将不会用于响应 Web 请求。

  • 为了进行额外保护,请不要对广告文件使用 .xml 文件扩展名。而应使用诸如 .ads 之类的扩展名,然后使用站点的 Web.config 文件中的下列元素在 IIS 中将 .ads 扩展名映射到 ASP.NET,并在 ASP.NET 中将它映射到禁止处理程序:

    <httpHandlers>
      <add verb="*" path="*.ads" type="System.Web.HttpForbiddenHandler" />
    </httpHandlers>
    

    有关如何在 IIS 中将文件扩展名映射到 ASP.NET 的信息,请参见如何:注册 HTTP 处理程序

  • 为将要读取广告文件的一个或多个用户帐户设置适当的权限(通常为只读)。如果网站支持匿名访问,这通常是本地 ASPNET 用户帐户或 NETWORK SERVICE 帐户。

  • 如果广告文件不存在,AdRotator 控件将引发一个错误,该错误中显示该文件的路径和名称,这有可能泄漏敏感信息。可通过采用适当的错误处理技术来避免此问题,包括在配置文件中设置 customErrors 元素以重定向到自定义错误页,并创建一个在应用程序任意位置出现未处理的异常时进行调用的全局错误处理程序。有关详细信息,请参见如何:显示安全错误信息

  • 如果您从数据库读取广告信息,请遵循保护数据库访问的准则。有关详细信息,请参见保证数据访问的安全

  • 首先仔细检查从不可信来源获取的任何广告信息,然后再将它用于 AdRotator 控件。因为 AdRotator 控件不执行任何验证,也不检查它从广告文件读取的信息,所以它会将图像和 URL 完全按照广告文件或数据库中的显示方式呈现到网页上。

BulletedList、CheckBoxList、RadioButtonList、DropDownList、ListBox

BulletedListCheckBoxListDropDownListListBoxRadioButtonList 控件基于集合的内容或数据库中的数据呈现不同类型的 HTML 元素(ul、input 和 select)。若要帮助保护这些控件,请遵循以下准则:

Calendar 控件

Calendar 控件呈现 LinkButton 控件,以便允许在日历中进行导航。LinkButton 控件使用客户端脚本来执行回发。如果浏览器出于安全目的已经关闭了客户端脚本,Calendar 控件将不支持导航。

即使您不用 Calendar 控件来启用日期导航,也可以始终使用该控件来显示日期。不要假设在 Calendar 控件中选择的任何日期的格式都是正确的。在将日期从 Calendar 控件转换成内部 DateTime 格式时,请确保使用适当的错误处理方式,以防日期的格式有误。

FileUpload 控件

FileUpload 控件使用户可以将文件从他们的计算机上载到 Web 服务器计算机。若要帮助保护 FileUpload 控件,请遵循以下准则:

  • 不要信任用户上载的文件,恶意用户可能试图上载可执行文件。当您保存已上载的文件时,请检查它的文件扩展名或者向该文件分配您自己的扩展名。

  • 不要允许用户为要用来保存上载文件的位置指定任意路径。检查文件名是否包含不是您亲自添加的路径信息。

  • 不要向上载文件的用户显示您的网站的内部结构。

  • 在将要保存上载文件的一个或多个文件夹上,为将运行应用程序的一个或多个用户帐户设置读写权限。如果网站支持匿名访问,这通常是本地 ASPNET 用户帐户或 NETWORK SERVICE 帐户。但是,仅将读写权限限制在供应用程序存储上载文件的文件夹。

  • 在配置文件中设置 httpRuntime 元素的 maxRequestLength 属性,从而防范拒绝服务攻击。默认情况下,最大请求长度是 4 兆字节 (MB)。其他可以影响上载文件大小的配置设置为 httpRuntime 元素的 requestLengthDiskThreshold 属性和 processModel 元素的 memoryLimit 属性。

  • 通过查询控件返回的 HttpPostedFile 对象的 ContentLength 属性来确定上载文件的大小,然后使用该大小来决定是否接受该文件。

HiddenField 控件

HiddenField 控件提供了一种用来在服务器代码中设置 HTML <input type="hidden"> 元素内容的方法。使用隐藏字段,可以将信息存储到在页处理过程中有用但不应被用户看到的页中。若要帮助保护 HiddenField 控件,请遵循以下准则:

  • 不要将敏感信息存储在 HiddenField 控件中。尽管此信息在浏览器中不可见,但是,它仍是页的一部分,用户可以在页的源代码中方便地查看它。

  • 不要信任隐藏字段中的信息。恶意用户可能会篡改隐藏字段的内容。

超链接

HyperLink 控件向浏览器呈现一个 URL。确保该 URL 指向受信任的位置。

Image 和 ImageMap 控件

为了显示图形,ImageImageMap 控件向浏览器呈现一个 URL。确保该 URL 指向受信任的位置。

ImageButton 控件

ImageButton 控件呈现一个使用客户端脚本执行回发的图像(img 元素)。如果浏览器出于安全目的已经关闭了客户端脚本,控件将无法正常工作。

为了显示图形,控件向浏览器呈现一个 URL。确保该 URL 指向受信任的位置。

Label 和 Literal 控件

LabelLiteral 控件通过将页上的文本按原样传递到浏览器来显示该文本。(使用 Label 控件,还可以指定格式。)如果文本包含 HTML 标记,则在默认情况下,浏览器将解释该标记并相应地呈现文本(可能包括正在运行的脚本)。

如果您使用的是 Label 控件,而且不确定文本中是否可能包含恶意内容,请使用 HTML 编码将 HTML 转换为它的文本表示形式。有关详细信息,请参见如何:通过对字符串应用 HTML 编码在 Web 应用程序中防止脚本侵入

如果您使用的是 Literal 控件,而且不确定文本中是否会包含恶意内容,请执行以下操作之一:

有关更多信息,请参见如何:通过对字符串应用 HTML 编码在 Web 应用程序中防止脚本侵入

LinkButton 控件

LinkButton 控件呈现一个使用客户端脚本执行回发的链接(a 元素)。如果浏览器出于安全目的已经关闭了客户端脚本,控件将无法正常工作。

MultiView

MultiView 控件让您可以添加多个 View 控件并有条件地显示这些控件。这会使您能够创建类似于多页窗体的页。

如果您基于可被轻松篡改的内容(如 URL 查询字符串)切换视图,则可能会让他人看到不应当看到的视图。因此,请确保视图切换机制尽可能安全。有关更多信息,请参见 ASP.NET 状态管理概述

TextBox 控件

因为 TextBox 控件允许用户在页中输入几乎任何文本,所以,您在接受用户使用该控件输入的内容时一定要小心。若要帮助保护 TextBox 控件,请遵循以下准则:

  • 尽可能使用验证控件,以便将用户的输入内容限制在可接受的值。有关详细信息,请参见验证控件介绍

  • 在运行服务器代码之前应确保 IsValid 属性设置为 true。

  • 使用冗余服务器验证。对于 CustomValidator 控件尤其如此;不要创建仅客户端验证逻辑。

  • 设置 TextBox 控件的 MaxLength 属性,以便限制用户可以输入的文本数量。通过在文本框中发送大量信息,恶意用户能够影响应用程序的性能,并且有可能导致数据库错误。

  • 采用 HtmlEncode 方法对用户输入进行编码,该方法可将 HTML 转换为文本表示形式(例如,将 <b> 转换为 &ltb&gt;),并有助于防止在浏览器中执行 HTML。有关详细信息,请参见如何:通过对字符串应用 HTML 编码在 Web 应用程序中防止脚本侵入

  • TextMode 属性设置为 Password,以防止在文本框中查看文本框的内容(通过显示点)。请注意,将 TextMode 属性设置为 Password 不提供任何其他保护;文本框的内容不进行加密,也不进行模糊处理,这些信息会以明文形式发送到服务器。因此,在使用 Password 时,请提供其他方法以确保数据安全。

  • 如果收集敏感信息(如密码或信用卡号),请使用安全套接字层 (SSL) 来确保客户端和服务器之间的通信安全。这适用于 TextBox 控件的任何使用情况,包括合并 TextBox 控件的控件,如 CreateUserWizard 控件。

向导

使用 Wizard 控件,可以创建多步骤输入窗体。在使用 Wizard 控件时,请注意以下安全注意事项:

  • Wizard 不会在内部保护敏感信息。如果在向导中收集敏感数据,请使用 SSL 来确保包含 Wizard 的页的客户端和服务器之间的通信安全。

  • 为了支持它的功能,Wizard 控件中包括许多不可见的控件。用户有可能会操作这些控件及其值,以便不按顺序显示向导步骤或者显示应当只向某些用户显示的向导步骤。为了防止出现这种情况,请确保向导步骤按正确的顺序显示,并确保只有在应用了正确的条件时才显示包含敏感信息的步骤。

XML 控件

Xml 控件在页上显示 XML 文件的内容或者包含 XML 的字符串,还可以应用 XML 转换。若要帮助保护 Xml 控件,请遵循以下准则:

  • 由于站点的 App_Data 文件夹的内容将不会用于响应 Web 请求,因此,如果可行的话,在显示 XML 文件内容时可以将 XML 文件放在该文件夹中。

  • 仅显示来自受信任来源的 XML。

  • 仅使用来自受信任来源的转换。

请参见

概念

保证登录控件的安全

保护 Web 部件页

保证数据访问的安全