System.Xml 安全指南

下面各节提供的一般指南,可用于帮助保证 System.Xml 应用程序的安全。

注意注意

System.Xml 组件依赖于 .NET Framework 安全系统。本主题仅解决专门由 XML 类处理的安全问题。有关更多信息,请参见 .NET Framework 中的安全性

安全问题

安全问题可以分为下列三个常规类别。

外部访问

多项 XML 技术可以在处理期间检索其他文档。例如,文档类型定义 (DTD) 可以驻留在正在分析的文档中。DTD 还可以驻留在正在分析的文档所引用的外部文档中。XML 架构定义语言 (XSD) 和 XSLT 技术还可以包括其他文件中的信息。这些外部资源会引发一些安全问题:

  • 如何确保应用程序只从可信站点检索文件?例如,如果 XML 文档包含对 Internet 文件的文件引用,是否希望应用程序检索此文件?

  • 如果检索某个文件,如何确保该文件不包含恶意数据?

拒绝服务

由于 XML 文档可以包含对其他文件的引用,因此,很难确定分析 XML 文档所需的处理能力。例如,XML 文档可以包括 DTD。如果 DTD 包含嵌套实体或复杂内容模型,可能需要大量时间来分析文档。

下列方案被认为不太容易受到拒绝服务攻击,原因是 System.Xml 类可以防止受到此类攻击。要了解在使用 System.Xml 组件时可能引发的安全问题类型,以及要缓解这些威胁可以采取的措施,请参见 System.Xml 安全注意事项

  • 分析文本 XML 数据。

  • 如果 Microsoft SQL Server 2005 生成了二进制 XML 数据,则分析二进制 XML 数据。

  • 将数据源中的 XML 文档和片断写入文件系统、流、TextWriterStringBuilder

  • 如果使用的是 XmlReader 对象,并且 DtdProcessing 设置为 Prohibit,则将文档加载到文档对象模型 (DOM) 对象。

  • 浏览 DOM 对象。

如果担心受到拒绝服务攻击,或处于不可信的环境下,建议不要使用下列方案。

  • DTD 处理。

  • 架构处理。这涉及到将不可信架构添加到架构集合中、编译不可信架构以及使用不可信架构进行验证。

  • XSLT 处理。

  • 分析用户提供的二进制 XML 数据的任意流。

  • DOM 操作,例如查询、编辑、在文档之间移动子树以及保存 DOM 对象。

使用 XmlReader 时,通过设置 MaxCharactersInDocument 属性,您可以限制能够分析的文档大小。通过设置 MaxCharactersFromEntities 属性,您可以限制从扩展实体中生成的字符数。有关设置这些属性的示例,请参见相应的参考主题。

处理

XSD 和 XSLT 技术具有其他一些可能影响处理性能的功能。例如,在计算相对较小的文档时,构造的 XML 架构可能需要大量的时间来处理。还可能会在 XSLT 样式表中嵌入脚本块。两种情况都会对应用程序造成潜在的安全威胁。

安全问题的缓解措施

以下各节详细介绍前面“安全问题”标题下提出的问题的缓解措施。

外部资源

XmlUrlResolver 类是 System.Xml 命名空间中所有类的默认解析器。该类用于加载 XML 文档、解析外部资源(例如实体、DTD 或架构)以及导入或包含指令。

使用 API,可以通过指定要使用的 XmlResolver 对象来重写此类。如果需要打开自己无法控制的或不可信的资源,请使用 XmlSecureResolver 类。XmlSecureResolver 包装 XmlResolver 并允许您限制基础 XmlResolver 有权访问的资源。

DTD 处理

如果您担心拒绝服务问题或您在处理不可信的源,则不要启用 DTD 处理。默认情况下,由 Create 方法创建的 XmlReader 对象上禁用 DTD 处理。

注意注意

默认情况下,XmlTextReader 允许进行 DTD 处理。可以使用 XmlTextReader.DtdProcessing 属性禁用此功能。

如果启用了 DTD 处理,可以使用 XmlSecureResolver 限制 XmlReader 可以访问的资源。还可以设计应用程序以使 XML 处理受内存和时间的约束。例如,在 ASP.NET 应用程序中配置超时限制。

XSLT 处理

在创建使用 XslCompiledTransform 类的应用程序时,应了解下列项及其含义:

  • 默认情况下禁用 XSLT 脚本。仅当要求脚本支持并且处于完全可信的环境中时,才应启用 XSLT 脚本。

  • 默认情况下禁用 XSLT document() 函数。如果启用 document() 函数,通过将 XmlSecureResolver 对象传递给 Transform 方法,限制可以访问的资源。

  • 默认情况下启用扩展对象。如果包含扩展对象的 XsltArgumentList 对象传递给 Transform 方法,将使用这些扩展对象。

  • XSLT 样式表可以包括对其他文件的引用以及嵌入式脚本块。恶意用户可能会利用这一点,方法是为您提供数据或样式表,在执行时,可能会使您的系统不断进行处理,直到计算机资源不足。

  • 在混合信任环境下运行的 XSLT 应用程序可能会引发样式表欺骗。例如,恶意用户可能会为对象加载有害的样式表,并将其交给另一个用户,而后者会继续调用 Transform 方法并执行转换。

如果不启用脚本或 document() 函数(除非样式表来自可信的源),或不接受来自不可信的源的 XslCompiledTransform 对象、XSLT 样式表或 XML 源数据,可以缓解这些安全问题。

异常处理

由较低级别的组件引发的异常可能会泄露您不希望暴露给应用程序的路径信息。应用程序必须捕获异常并进行相应的处理。

XmlTextWriter 的用法

在将 XmlTextWriter 传递给另一个应用程序时,基础流会公开给该应用程序。如果需要将 XmlTextWriter 传递给不完全可信的应用程序,应使用通过 Create 方法创建的 XmlWriter 对象。

请参见

任务

如何:使用 XmlSecureResolver 类

其他资源

安全性和 System.Xml 应用程序