保证浏览器定义文件的安全

更新:2007 年 11 月

浏览器定义文件(.browser 文件)包含有关浏览器(如 Internet Explorer)类的功能信息以及特定浏览器(如 Internet Explorer 6.0)的功能信息。在运行时,ASP.NET 使用 .browser 文件中的信息来确定哪个浏览器发出了请求、该浏览器具有哪些功能以及如何向该浏览器呈现标记。有关更多信息,请参见浏览器定义文件架构(browsers 元素)

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

ms228049.alert_note(zh-cn,VS.90).gif说明:

浏览器定义文件在 .NET Framework 版本 2.0 中是新增的。在早期版本的 .NET Framework 中,使用 browserCaps 元素在配置文件中定义浏览器定义。

浏览器定义文件安全性

所有浏览器功能(包括 .NET Framework 类和浏览器定义文件)都要求应用程序级别的部分信任,并且要求全局级别的完全信任。将全局浏览器定义程序集放入全局程序集缓存之前,使用唯一的计算机密钥进行了签名,因而无法篡改。%SystemRoot%\Microsoft.NET\Framework\version\CONFIG\Browsers 目录中的浏览器定义文件受访问控制列表 (ACL) 的保护,需要有管理权限才能修改。

浏览器定义文件目录

全局浏览器目录和应用程序级别的 App_Browsers 子目录应只包含文件扩展名为 .browser 的文件。只有 .browser 文件是通过 ASP.NET 浏览器功能编译的。此外,ASP.NET 保护这些目录中的文件不被 Web 服务器使用,并且不被其他应用程序中的代码访问。

浏览器定义文件 ACL

下表列出了默认情况下在 %SystemRoot%\Microsoft.NET\Framework\version\CONFIG\Browsers 目录中的 .browser 文件中设置的 ACL。这些 ACL 还会在该目录本身上设置,但是它们包括 CREATOR OWNER 组的“修改”权限。该目录是只读的。

Windows 帐户

权限

Administrators

完全控制

ASP.NET 计算机帐户(<服务器>\ASPNET)

读取和执行

CREATOR OWNER

完全控制

IIS_WPG(<服务器>\IIS_WPG)

读取和执行

LOCAL SERVICE

读取和执行

NETWORK SERVICE

读取和执行

Power Users(<服务器>\Power Users)

修改

SYSTEM

完全控制

Users(<服务器>\Users)

读取和执行

下表列出了应该在 App_Browsers 子目录中的应用程序级别的 .browser 文件上设置的 ACL。

Windows 帐户

权限

Administrators

完全控制

IIS_WPG(<服务器>\IIS_WPG)

读取和执行

INTERACTIVE

读取

Internet 来宾帐户(<服务器>\IUSR_<服务器>)

Read

NETWORK

读取

NETWORK SERVICE

Read

SYSTEM

完全控制

Users(<服务器>\Users)

读取和执行

ASP.NET 网站管理工具 帐户

特殊

添加浏览器定义文件

仅下载或安装来源受信任的浏览器定义文件。例如,检查新的浏览器定义文件,以查看下列任一属性中是否引用了任何不熟悉的命名空间:

  • controlAdapters 元素的 markupTextWriterType 属性。

  • capability 元素的 value 属性。

  • adapter 元素的 controlType 和 adapterType 属性。

有关有效的元素和属性的信息,请参见 浏览器定义文件架构(browsers 元素)

更改浏览器定义文件

如果向全局目录添加新的浏览器定义文件,或者对全局浏览器定义文件进行更改,则直到您使用 Aspnet_regbrowsers.exe 工具(存在于 %SystemRoot%\Microsoft.NET\Framework\version 文件夹中)手动重新编译浏览器功能集合,或者使用 BrowserCapabilitiesCodeGenerator 类以编程方式进行重新编译,这些功能才会生效。

但是,您无需重新编译对应用程序级别的浏览器定义所做的更改。这样的更改是动态地重新编译和重新应用的。

保护共享宿主环境中的浏览器定义文件

在共享宿主环境中,恶意用户有可能会通过直接修改浏览器文件、通过配置 API 以及其他管理和配置工具来修改浏览器定义文件,来修改浏览器定义文件设置。为了减轻该威胁,请在浏览器定义文件上保持强 ACL。浏览器定义文件目录的内容是经过编译的,因此保护它们的方式与保护应用程序中任何其他代码目录的方式应该相同。如果主机管理员禁止用户向应用程序添加代码,则同时也应禁止该用户添加浏览器定义文件。

保持浏览器定义文件上的文件锁定

只有在多次尝试保存到浏览器定义文件或者打开某个文件句柄时,才会锁定浏览器定义文件。恶意用户可能会试图锁定 %SystemRoot%\Microsoft.NET\Framework\version\CONFIG\Browsers 目录中的浏览器定义文件。但是,锁定浏览器定义文件要求完全信任,而默认情况下完全信任在 ASP.NET 中是禁用的。

使用配置 API 读取任意文件

浏览器定义配置 API 的类不能读取不属于应用程序域的任何目录或者不具有 .browser 文件扩展名的任何文件。

缓存浏览器功能

在运行时,浏览器定义文件信息合并到 BrowserCapabilitiesFactory 对象中的已知浏览器集合中。发出请求时,ASP.NET 根据请求标头标识请求浏览器,并编译一个响应请求浏览器的 HttpCapabilitiesBase 对象。该对象被放入缓存,可以被同一浏览器发出的其他请求再次使用。

恶意客户端可能会尝试使用请求(其中每个新请求使用不同的请求标头)来冲击您的 Web 服务器,导致 ASP.NET 为每个请求生成并缓存浏览器功能对象,而这将导致发生拒绝服务攻击。若要减轻该威胁,请配置 Machine.config 文件或 Web.config 文件中 browserCaps 元素(ASP.NET 设置架构) 元素的 userAgentCacheKeyLength 属性。该元素定义用作标识内部缓存中已缓存功能对象的密钥的字符长度。默认值为 64。您可以减小该值,以增加在缓存中找到匹配的浏览器的可能性,从而减少缓存的负荷。

异常

若要防止向不必要的源公开敏感信息,可对应用程序进行配置,从而做到不显示详细的错误信息,或者仅当客户端是 Web 服务器本身时才显示详细错误信息。有关更多信息,请参见 customErrors 元素(ASP.NET 设置架构)

事件日志

如果服务器运行的是 Windows Server 2003,则可以通过保护事件日志以及设置有关事件日志的大小、保留时间和其他特性的参数(以防止间接拒绝服务攻击),来提高应用程序的安全性。有关配置事件日志的更多信息,请在 Windows 帮助和支持中搜索“事件查看器”。

请参见

任务

如何:在 ASP.NET 网页中检测浏览器类型

概念

ASP.NET Web 服务器控件和浏览器功能

保证浏览器定义文件的安全

ASP.NET 配置方案

ASP.NET 设备筛选概述

自适应控件行为的结构概述

ASP.NET 移动 Web 开发概述

保证 ASP.NET 配置的安全

参考

浏览器定义文件架构(browsers 元素)

其他资源

保证 ASP.NET 网站的安全