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:import
、xsl:include
或 document()
函数等功能。 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。