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 或更高版本 不支持 它们。

准则

仅当样式表来自受信任的源时启用脚本。 如果无法验证样式表的源,或者样式表不是来自受信任的源,请 null 传入 XSLT 设置参数。

外部资源

XSLT 语言具有诸如 xsl:importxsl:includedocument() 函数等特性,其中处理器需要解析 URI 引用。 该 XmlResolver 类用于解析外部资源。 在以下两种情况下,可能需要解决外部资源:

每个 LoadTransform 方法都有重载,可以接受 XmlResolver 作为它的参数之一。 如果未指定凭据 XmlResolver ,则使用不带凭据的默认值 XmlUrlResolver

准则

document()仅当样式表来自受信任的源时,才启用该函数。

以下列表描述了何时可能需要指定对象 XmlResolver

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

  • 如果要限制 XSLT 进程可以访问的资源,可以使用具有正确权限集的 XmlSecureResolverXmlSecureResolver如果需要打开不控制的资源或不受信任的资源,请使用该类。

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

  • 如果要确保不访问任何外部资源,可以将 null 参数指定为 XmlResolver

另请参阅