保护 Web 部件页

更新:2007 年 11 月

Web 部件是 ASP.NET 的一项新功能,它赋予最终用户修改或个性化网页的能力。对于 Web 应用程序的用户来说,个性化网页具有强大的功能,但也带来开发人员应该了解的安全隐患。

Web 部件安全问题

由于 Web 部件是一种 ASP.NET 功能,而 Web 部件控件是扩展的 ASP.NET 服务器控件,因此,Web 部件页容易遭受所有与 ASP.NET 页相同的风险。具有使用 Web 部件控件的页的 Web 应用程序实际上不过是一种专用类型的 ASP.NET 应用程序,而使用 Web 部件的应用程序可以运行在普通 ASP.NET 应用程序可以运行的任何信任级别上。有关 ASP.NET 网站安全的常规信息,请参见 保证 ASP.NET 网站的安全。不过,Web 部件具有普通 ASP.NET 页所不具有的一些特殊的安全问题。以下几节对这些问题进行了探讨。

导入控件数据

最具安全风险的 Web 部件功能就是导入功能。该功能允许用户导入包含服务器控件(该控件的程序集文件在 Web 服务器上必须可用)的状态数据和属性数据的 XML 说明文件。为控件导入数据是用户共享数据以及轻松配置复杂控件的一种方法。但这种做法具有内在风险:说明文件中可能存在恶意数据。例如,如果有人将恶意脚本代码作为字符串属性的值放在说明文件中,则当用户导入说明文件并将引用的服务器控件添加到网页时,就有可能执行该脚本。若要使导入带有恶意数据的说明文件的风险降到最低,具有字符串类型属性的服务器控件应该始终对属性数据进行编码。其他风险包括通过说明文件导入的类型(请参见 Web 部件控件说明文件)。恶意用户可以通过提交请求将许多程序集加载到 AppDomain 中,导致大量内存被占用。若要消除与导入有关的风险,只需不使用实现导入的服务器控件以完全禁用导入功能即可。另外,也可以限制哪些用户可以访问该控件。例如,可以使用角色管理。如果用户为管理员角色,则可以以编程方式为此用户向该页添加 ImportCatalogPart。有关该控件的更多信息,请参见 ImportCatalogPart 类的参考主题。

导出控件数据

导出功能的风险与导入功能基本相同,这是因为它会泄漏敏感数据。导出功能可以帮助用户将特定控件的属性和状态数据保存到 XML 说明文件。(该文件就是可以使用导入功能导入的文件。)此处的主要风险在于用户可能会将敏感数据从应用程序导出到说明文件,而说明文件是一个简单的文本文件,具有适当权限的任何人都可以读取它。默认情况下,ASP.NET 中禁用导出功能,因此,如果不需要使用该功能,可以放心地忽略它。显然,这是最安全的选择。

如果确实需要启用导出功能,应该知道用于确定可导出哪些属性的选项。在创建将在 WebPartZone 区域中使用的 WebPart 或服务器控件时,对于希望能导出的各公共属性 (Property),可以为其添加 Personalizable 元数据属性 (Attribute)。这样,如果启用导出功能,属性将可以导出,并且还将向用户显示一个消息框,警告用户将导出数据。Personalizable 属性的其中一个参数称为 IsSensitive。这是一个布尔型参数,如果您希望某个属性在某些情况下可导出,而在其他情况下又不可导出,此参数将非常有用。有关详细信息和示例,请参见 ExportMode 属性的参考主题。

了解个性化设置的详细信息

Web 部件个性化设置功能可以使用户根据自己的喜好修改网页并将其设置保存在长期存储中,从而使个性化页在浏览器会话过程中保持这些设置。大多数 Web 部件功能都要求个性化设置;因此,虽然仅在包含 Web 部件控件的页上才使用该功能,但在默认情况下,ASP.NET 网站启用该功能。正是由于个性化设置的功能如此强大,它也带来了一定程度的风险。用户能够修改网页的实际布局、外观甚至内容和控件。个性化设置数据存储在一个数据库中,并用于呈现页,因此,用户很可能实施与网站内容相关的恶意活动。可以访问共享个性化设置范围的用户甚至可以更改页面向所有用户呈现的方式。

如果某个特定页使用 Web 部件功能但不要求个性化设置(例如,门户站点中的公用页之一),则最好禁用个性化设置,因为这样可以提高性能并降低站点的安全风险。有关更多信息,请参见如何:禁用 Web 部件个性化设置

对用户进行身份验证以进行个性化设置

个性化设置要求对用户进行身份验证。对于匿名用户是无法启用个性化设置的。这意味着,若要获得完整的个性化设置和 Web 部件功能,网站必须使用基于 Windows 或基于窗体的身份验证。有关身份验证选项的信息,请参见 ASP.NET Web 应用程序的基本安全做法。若要使用新成员资格功能(使用 Forms 身份验证)设置站点,请参见使用成员资格管理用户

将最低访问权限授予共享个性化设置

Web 部件个性化设置的更改总是应用于指定范围的用户。只有做出更改的用户才能看到对用户范围所做的更改,但所有用户都可以看到对共享范围所做的更改。共享个性化设置范围之所以存在,是为了使管理员或管理角色的用户可以对应用于站点所有用户的页进行更改。在默认情况下,所有用户都不能访问共享范围。只有所选用户才能获得访问权限,这应该在网站的配置文件中显式进行。有关详细信息,请参见如何:启用 Web 部件页的共享个性化设置

使用经过测试且受信任的控件

由于 Web 部件可以为用户提供强大的功能(如在页中添加新服务器控件的能力),因此,开发人员应该特别注意在 Web 部件应用程序中使用哪些服务器控件。应该对服务器控件(尤其是来自第三方或供应商的控件)仔细地进行检查和测试,以确保它们能可靠地用于 Web 部件应用程序。例如,假设某个特定服务器控件设计不佳,导致内存使用率低。如果将该控件添加到 Web 部件目录中,用户就有可能将其添加到网页上。而由于可以将目录中的控件任意多次地(多个实例)添加到页上,因而用户可能多次添加该执行性能不佳的控件。当页面试图处理该控件的多个实例时,实际上就可能产生“拒绝服务”攻击。有关 Web 部件目录的更多信息,请参见 CatalogPart 类的参考主题。

对控件使用授权和筛选

Web 部件有一项功能,通过它,可以设置和检查用于创建 Web 部件页的用户界面 (UI) 的服务器控件的授权级别。如果控件是根据您设置的条件授权的,它将显示在页上;如果控件是在较低级别上授权或根本未授权,则您可以相应地更改其外观或完全隐藏它。例如,假定有一个用户被指定为管理员。您可能希望只有管理员才能看到某个服务器控件。使用 Web 部件的授权和筛选功能,可以确保只有指定的管理员才能看到该控件,而其他用户则看不到该控件。使用授权和筛选功能的主要机制为:WebPart 类的 AuthorizationFilter 属性,以及 WebPartManager 类的 IsAuthorizedOnAuthorizeWebPart 方法。

在编辑控件中对字符串类型的属性进行编码

Web 部件有一项独特的功能,即最终用户可以将页切换到编辑模式,他们可以通过更改其布局、外观、行为以及可个性化的属性值来编辑服务器控件。不过,这一功能带来了一定的风险,因为恶意用户可以借助此功能编辑字符串类型的属性,从而插入不恰当的数据或者试图发起脚本注入式攻击。如果创建自定义 EditorPart 控件来编辑服务器控件,并且如果指定的服务器控件中有任何可个性化的属性属于字符串类型或者使用字符串转换器,则 EditorPart 控件应该先对字符串数据进行编码,然后再将其分配给该属性,这是一种安全的做法。有关示例,请参见 HtmlEncode 方法的参考文档。

请参见

参考

System.Web.UI.Design.WebControls.WebParts

其他资源

ASP.NET Web 部件控件