XSLT 安全注意事项

XSLT 语言具有一组丰富的功能,为您带来强大的功能和灵活性。 其中的许多功能尽管非常有用,但是也可能会被外部源利用。 为了安全地使用 XSLT,必须了解在使用 XSLT 时出现的安全问题类型以及可以用于缓解这些风险的基本策略。

XSLT 扩展

两种常用的 XSLT 扩展是样式表脚本和扩展对象。 这些扩展允许 XSLT 处理器执行代码。

  • 扩展对象为 XSL 转换添加编程功能。

  • 脚本可以使用 msxsl:script 扩展元素嵌入样式表。

扩展对象

扩展对象使用 AddExtensionObject 方法添加。 支持扩展对象要求具有 FullTrust 权限集。 这样可以确保在执行扩展对象代码时,不会发生权限升级。 如果在没有 FullTrust 权限的情况下尝试调用 AddExtensionObject 方法,将引发安全异常。

样式表脚本

脚本可以使用 msxsl:script 扩展元素嵌入样式表。 脚本支持是 XslCompiledTransform 类上的一项可选功能,默认情况下禁用该功能。 通过将 XsltSettings.EnableScript 属性设置为 true 并将 XsltSettings 对象传递给 Load 方法,可以启用脚本。

注意

只有 .NET Framework 支持脚本块。 .NET Core 或 .NET 5(或更高版本)不支持它们。

准则

只有样式表来自可信的源时,才应启用脚本。 如果不能验证样式表的源,或者样式表不是来自可信的源,则为 XSLT 设置参数传入 null

外部资源

如果处理器需要解析 URI 引用,XSLT 语言包括 xsl:importxsl:includedocument() 函数等功能。 XmlResolver 类用于解析外部资源。 在下列两种情况下,可能需要解析外部资源:

LoadTransform 方法均包括接受 XmlResolver 作为一个参数的重载。 如果未指定 XmlResolver,将使用没有用户凭据的默认 XmlUrlResolver

准则

只有样式表来自可信的源时,才应启用 document() 函数。

下表说明可能需要指定 XmlResolver 对象的情况:

  • 如果 XSLT 进程需要访问要求进行身份验证的网络资源,可以使用具有必要的凭据的 XmlResolver

  • 如果要限制 XSLT 进程可以访问的资源,可以使用具有正确权限集的 XmlSecureResolver。 如果需要打开自己无法控制的或不可信的资源,请使用 XmlSecureResolver 类。

  • 如果要自定义行为,可以实现自己的 XmlResolver 类并使用该类解析资源。

  • 如果要确保不访问任何外部资源,可以为 null 自变量指定 XmlResolver

请参阅