ASP.NET 网站导航提供集中存储的页面链接的维护功能。通过页面中的特定 Web 服务器控件可以将这些链接以列表或导航菜单的方式进行呈现。
ASP.NET 网站导航经常用于导航控件(如 SiteMapPath
,SiteMapDataSource
,TreeView
,以及 Menu
控件;或者与 SiteMap
和 SiteMapProvider
对象一起进行可编程操作。本文将描述如何才能改进这些导航特征的安全性。
虽然下列代码和配置练习有助于改进应用程序的安全性,但是为应用程序服务器的 Microsoft Windows 和 Internet Information Services(IIS)持续保持最新的安全更新包仍然是重要的,当然也包括 Microsoft SQL Server 或其他成员关系数据源的更新包。
至于编写安全代码和应用程序安全性的详细信息请参考 Michael Howard 和 David LeBlanc 共同编著的《编写安全代码》一书,以及 Microsoft 样本和练习 网站提供的指南。
ASP.NET 网站导航特征默认时被启用。可以将配置文件(Web.config)中 siteMap
元素的 enabled
参数设置成 false
来禁用该特征。以下部分讨论 Web.config 文件中导航相关数据的安全性。
使用默认的 ASP.NET 网站地图提供者时并不需要对 Web.config 文件中的安全导航配置进行设置。但是,如果实现了自定义网站地图提供者,并且通过保存在配置文件中的数据库连接串对数据库进行使用,则需要按照安全数据访问中的推荐操作来加密连接字符串。
在托管环境中,配置文件必须拒绝针对于 siteMap
元素的覆盖操作,这有助于防止通过其他网站地图或网站地图提供者对配置文件所做的更改。
可以在 Web.config 文件中使用 urlMapping
元素将配置文件中的 URL 映射成更友好的 URL 格式。ASP.NET 只允许应用程序相关语法,比如,“~/文件名.aspx”。换句话说,ASP.NET 不允许将 URL 映射到应用程序之外的页面。这有助于保护应用程序的页面不会被同一托管环境中的其他 ISP 客户访问。
默认时,ASP.NET 会在客户端下载之前对含有已知扩展名类型的文件进行保护(如 .sitemap)。为了保护网站数据,请将扩展名不是 .sitemap 的自定义网站地图数据文件存放进 App_Data 目录并指派合适的访问控制列表(ACL)。比如,在 Windows 2000 或 Windows XP 中,授与 ASP.NET 进程帐号的只读访问权限。而在 Windows 2003 中,则授与 Network Service 的只读访问权限。
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 的访问。比如,创建与 http://www.microsoft.com 通讯的网站地图节点并启用安全性调整,由于 ASP.NET 无法检测该外部 URL 的访问权限,所以该链接对于客户端而言是不可见的。如果在启用安全性调整并且拥有外部 URL 链接的情况下,设置节点的 roles
参数值为星号(*),这样就会启用链接的可见状态,而不管 ASP.NET 是否能够得到外部链接的访问权限,所有客户端仍然可以查看到链接的内容。
网站导航对象对于在计算机上运行的任何代码都是公用的。网站导航对象运行在最小可信范围内。但是,低可信度在装载网站数据时仍然是必需的,因为 ASP.NET 使用默认的网站地图提供者或 XmlSiteMapProvider
打开网站地图文件时需要使用文件的 I/O 操作。作为选择,开发者可以开发出不受此限制的自定义网站地图提供者。
在实现自定义网站地图提供者时,请先确保提供者已经过严格的安全测试。这在需要自定义网站地图提供者在托管方案中的安全运行时显得格外重要,如果无法正确实现,将会出现包括默认配置设定在内的信息暴露漏洞。严格按照安全建议进行测试有助于消除各种恶意攻击(如 SQL 注入攻击等)。
以下部分讨论如何减少由未知错误消息和事件引发的潜在安全隐患。
通常,由 ASP.NET 网站导航特征所引发的异常并不会暴露特殊信息。同时对无效的用户输入和请求进行检查并测试 Web 应用中的自定义对象也有助于防止暴露异常发生时的特殊信息。
为了防止机密信息的暴露,可以采用启用应用程序自定义错误特征,或者在客户端是 Web 服务器自身的时候才显示详细的错误信息这两种方法。
如果计算机运行的是 Windows Server 2003 操作系统,可以通过事件日志来改进应用程序安全性。同样,对尺寸,保留方案等相关参数的设置有助于防止通过日志实施的间接服务攻击。默认时,仅 Administrators 安全组中的成员才可以查看事件日志的内容。
病毒扫描工具不能够修改网站地图文件。否则会频繁引发不必要导航数据重新装载操作,因为基于文件的 ASP.NET 网站导航特征会时刻保持对导航数据的更新通知,并在文件更新后自动进行装载新的内容。