保证 ASP.NET 站点导航的安全
更新:2007 年 11 月
ASP.NET 站点导航提供了一种功能,可用于维护指向网站中所有页面的中央链接存储区。然后,通过包括特定的 Web 服务器控件,可以将这些链接作为列表或导航菜单呈现于每个页面上。
ASP.NET 站点导航通常结合导航控件使用,如 SiteMapPath、SiteMapDataSource、TreeView 和 Menu 控件;或通过编程的方式结合 SiteMap 和 SiteMapProvider 类使用。本主题中的信息描述了如何提高导航功能的安全性。
尽管遵循编码和配置最佳做法有助于提高应用程序的安全性,还有一点也很重要,那就是使用 Microsoft Windows 和 Internet 信息服务 (IIS) 的最新安全更新,以及 Microsoft SQL Server 或其他成员数据源的任何更新,保持应用程序服务器最新。有关更多信息,请参见 Windows Update 网站。
有关编写安全代码及保护应用程序的最佳做法的详细信息,请参见由 Michael Howard 和 David LeBlanc 合著的“Writing Secure Code”(《编写安全代码》),以及 Microsoft Patterns and Practices(Microsoft 模式和实践)网站上提供的指导。另请参见 Web 应用程序的基本安全实施策略。
主题内容
保证导航配置的安全
保证站点地图数据的安全
对特定用户隐藏导航链接
网站地图 API
保证自定义站点地图提供程序实现的安全
错误消息和事件
病毒扫描程序
保证导航配置的安全
默认情况下,ASP.NET 站点的导航功能处于启用状态。通过在配置文件 (Web.config) 中将 siteMap 元素的 enabled 属性设置为 false,可以禁用这些功能。接下来的一节将讨论如何保护 Web.config 文件中的导航相关数据。有关导航配置设置及其默认值的信息,请参见 siteMap 元素(ASP.NET 设置架构)。
保证配置值的安全
如果使用默认的 ASP.NET 站点地图提供程序,则不需要保护 Web.config 文件中所包含的导航配置设置。但是,如果实现使用数据库的自定义站点地图提供程序,并将数据库连接字符串存储在配置文件中,则请遵循保证数据访问的安全中的建议,对连接字符串进行加密。
在宿主环境中,配置文件应拒绝 siteMap 元素(ASP.NET 设置架构) 元素的重写权限,这样有助于防止有人重新配置网站,使用不同的网站地图或网站地图提供程序。有关更多信息,请参见锁定配置设置。另请参见寄宿环境中的 ASP.NET 应用程序安全性。
URL 映射
通过使用 Web.config 文件中的 urlMappings 元素(ASP.NET 设置架构) 元素,可在配置文件中将 URL 映射到友好的 URL。ASP.NET 只允许与应用程序相关的语法,例如,~/filename.aspx。也就是说,ASP.NET 不允许映射的 URL 指向应用程序之外的页面。这样有助于防止 ISP 客户端试图查看宿主环境中其应用程序之外的页面。
保证站点地图数据的安全
默认情况下,ASP.NET 配置为阻止客户端下载具有已知文件扩展名(如 .sitemap)的文件。为了帮助您保护数据,可将文件扩展名不为 .sitemap 的任何自定义站点地图数据文件放入 App_Data 文件夹中,并应用适当的访问控制列表 (ACL)。例如,在 Windows 2000 或 Windows XP 上,授予 ASP.NET 进程帐户只读访问权限。在 Windows 2003 上,授予网络服务只读访问权限。有关更多信息,请参见 ASP.NET 必需的访问控制列表 (ACL)。
只有应用程序的目录结构中存在站点地图文件时,ASP.NET 站点导航才会加载该文件。这样有助于保护宿主环境中的应用程序,避免其站点地图数据被另一应用程序加载。
ASP.NET 站点导航不允许访问应用程序目录结构之外的文件。如果站点地图包含引用另一站点地图文件的节点,而该文件又位于应用程序之外,则会发生异常。该异常包含 SiteMapNode 中指定的路径,将其作为应用程序范围外的资源列出,但该异常并不会指示路径是否有效。这样有助于防止有人使用 ASP.NET 站点导航来发现服务器上的有效文件路径。
如果实现了使用数据库的自定义站点地图提供程序,若要获得有关如何在这种情况下帮助保护站点地图数据的信息,请参见保证数据访问的安全。
站点地图加载进程
默认的 ASP.NET 站点地图提供程序会加载站点地图数据作为 XML 文档,并在应用程序启动时将其作为静态数据进行缓存。超大型站点地图文件在加载时可能要占用大量的内存和 CPU 资源。在宿主环境中,应对客户可以为其站点创建的站点地图的大小进行限制。这样有助于防止遭受拒绝服务攻击。
ASP.NET 站点导航功能根据文件通知来保持导航数据最新。更改站点地图文件时,ASP.NET 会重新加载站点地图数据。如果站点导航结构由子站点地图组成,而又向用户授予了对子站点地图的写入权限,则可能会出现问题,因为用户可能不了解他们所做的每项更改都会引起站点地图数据的重新加载。确保对所有站点地图文件的访问权限加以限制。根据哪些用户有权更新哪些位置的文件来定义用户组,然后将站点地图文件的相关权限赋予给各个用户组。
对特定用户隐藏导航链接
ASP.NET 站点导航允许按角色保护各个站点地图节点。如果要对特定用户隐藏部分站点导航结构,可以启用 ASP.NET 安全裁剪。此功能一经启用,ASP.NET 便会检查 URL 授权,而且可以选择检查对站点地图节点中所列文件的文件访问权限。只有用户对文件具有访问权限时,ASP.NET 才会显示指向该文件的链接。如果要允许所有用户都可查看指向受限制文件的链接,请将相应站点地图节点的 roles 属性设置为一个星号 (*) 或通配符,这样便可使所有客户端都能查看该链接了。有关更多信息,请参见 ASP.NET 站点地图安全性调整。
在站点地图中包括外部 URL
在站点地图中,您可以引用 ASP.NET 应用程序外部的 URL。但是,ASP.NET 无法测试对应用程序外部 URL 的访问。例如,如果创建一个对应于 https://www.microsoft.com/china 的站点地图节点,并启用安全裁剪,客户端将无法看到该超链接,因为 ASP.NET 无法测试对外部 URL 的访问权限。如果启用安全裁剪,并具有对应于外部 URL 的站点地图节点,虽然 ASP.NET 无法授予对外部链接的访问权限,将这些节点的 roles 属性设置为一个星号 (*) 时,所有客户端仍能看到相应的外部链接。
站点导航 API
站点导航类对计算机上运行的所有代码公开。站点导航类在最小的信任级别下运行。但是,加载站点地图数据时仍需要低级别的信任,因为 ASP.NET 在使用默认站点地图提供程序 XmlSiteMapProvider 打开站点地图文件时,需要使用文件 I/O 操作。当然,也可以开发一个没有此限制的自定义站点地图提供程序。
有关更多信息,请参见 ASP.NET 信任级别和策略文件 和实现 ASP.NET 站点地图提供程序。
保证自定义站点地图提供程序实现的安全
实现自定义的站点地图提供程序时,请确保已根据安全最佳做法对该提供程序进行了检查。在宿主方案中,这一点尤其重要,因为如果没有正确实现,自定义站点地图提供程序可能会泄露某些信息,或包含不安全的默认配置设置。遵循最佳做法有助于避免一些攻击,如 SQL 注入式攻击。例如,应当始终验证参数输入。
有关保护数据库的信息,请参见保证数据访问的安全。另请参见寄宿环境中的 ASP.NET 应用程序安全性。
错误消息和事件
接下来的几节讨论如何缓解由意外错误信息和事件公开的潜在安全风险。
异常消息
ASP.NET 站点导航功能引发的异常不会公开特权信息。请对 Web 应用程序中的自定义类进行测试,查看是否存在无效的输入和请求,以帮助确保当发生异常时不会公开特权信息。
错误消息
为了帮助避免向不必要的源公开敏感信息,请打开应用程序的自定义错误,或仅在客户端为 Web 服务器本身时显示详细的错误信息。有关更多信息,请参见 customErrors 元素(ASP.NET 设置架构)。
事件日志
如果您的计算机正在运行 Windows Server 2003,保护事件日志有助于提高应用程序的安全性。另外,通过设置事件日志的相关参数(大小、保留时间等),还可以帮助避免针对日志发起的间接拒绝服务攻击。默认情况下,只有“Administrators”安全组的成员可以查看事件日志。有关配置事件日志的更多信息,请在“Windows 帮助和支持”中搜索“事件查看器”。
病毒扫描程序
对于病毒扫描程序之类的工具,不应将其配置为可修改站点地图文件。因为 ASP.NET 站点导航功能依赖于文件通知来保持导航数据最新,所以这会引起不必要的导航数据重新加载操作。