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:import
、xsl:include
或 document()
函数等特性,其中处理器需要解析 URI 引用。 该 XmlResolver 类用于解析外部资源。 在以下两种情况下,可能需要解决外部资源:
在编译样式表时,XmlResolver 用于解析
xsl:import
和xsl:include
。执行转换时,使用 XmlResolver 来解析
document()
函数。注释
默认情况下,该
document()
函数在类上 XslCompiledTransform 处于禁用状态。 通过将属性XsltSettings.EnableDocumentFunction设置为true
方法并将对象XsltSettings传递给Load方法,可以启用此功能。
每个 Load 和 Transform 方法都有重载,可以接受 XmlResolver 作为它的参数之一。 如果未指定凭据 XmlResolver ,则使用不带凭据的默认值 XmlUrlResolver 。
准则
document()
仅当样式表来自受信任的源时,才启用该函数。
以下列表描述了何时可能需要指定对象 XmlResolver :
如果 XSLT 进程需要访问需要身份验证的网络资源,您可以使用 XmlResolver 和必要的凭据。
如果要限制 XSLT 进程可以访问的资源,可以使用具有正确权限集的 XmlSecureResolver。 XmlSecureResolver如果需要打开不控制的资源或不受信任的资源,请使用该类。
如果要自定义行为,可以实现自己的 XmlResolver 类,并使用它解析资源。
如果要确保不访问任何外部资源,可以将
null
参数指定为 XmlResolver。