XSLT 安全注意事项
XSLT 语言具有一组丰富的功能,为您带来强大的功能和灵活性。 其中的许多功能尽管非常有用,但是也可能会被外部源利用。 为了安全地使用 XSLT,必须了解在使用 XSLT 时出现的安全问题类型以及可以用于缓解这些风险的基本策略。
XSLT 扩展
两种常用的 XSLT 扩展是样式表脚本和扩展对象。 这些扩展允许 XSLT 处理器执行代码。
扩展对象为 XSL 转换添加编程功能。
脚本可以使用 msxsl:script 扩展元素嵌入样式表。
扩展对象
扩展对象使用 AddExtensionObject 方法添加。 支持扩展对象要求具有 FullTrust 权限集。 这样可以确保在执行扩展对象代码时,不会发生权限升级。 如果在没有 FullTrust 权限的情况下尝试调用 AddExtensionObject 方法,将引发安全异常。
样式表脚本
脚本可以使用 msxsl:script 扩展元素嵌入样式表。 脚本支持是 XslCompiledTransform 类上的一项可选功能,默认情况下禁用该功能。 通过将 XsltSettings.EnableScript 属性设置为 true 并将 XsltSettings 对象传递给 Load 方法,可以启用脚本。
指南
只有样式表来自可信的源时,才应启用脚本。 如果不能验证样式表的源,或者样式表不是来自可信的源,则为 XSLT 设置参数传入 null。
外部资源
如果处理器需要解析 URI 引用,XSLT 语言包括 xsl:import、xsl:include 或 document() 函数等功能。 XmlResolver 类用于解析外部资源。 在下列两种情况下,可能需要解析外部资源:
在编译样式表时,XmlResolver 用于解析 xsl:import 和 xsl:include。
在执行转换时,XmlResolver 用于解析 document() 函数。
注意 默认情况下,XslCompiledTransform 类禁用 document() 函数。通过将 XsltSettings.EnableDocumentFunction 属性设置为 true 并将 XsltSettings 对象传递给 Load 方法,可以启用此功能。
Load 和 Transform 方法均包括接受 XmlResolver 作为一个参数的重载。 如果未指定 XmlResolver,将使用没有用户凭据的默认 XmlUrlResolver。
指南
只有样式表来自可信的源时,才应启用 document() 函数。
下表说明可能需要指定 XmlResolver 对象的情况:
如果 XSLT 进程需要访问要求进行身份验证的网络资源,可以使用具有必要的凭据的 XmlResolver。
如果要限制 XSLT 进程可以访问的资源,可以使用具有正确权限集的 XmlSecureResolver。 如果需要打开自己无法控制的或不可信的资源,请使用 XmlSecureResolver 类。
如果要自定义行为,可以实现自己的 XmlResolver 类并使用该类解析资源。
如果要确保不访问任何外部资源,可以为 XmlResolver 参数指定 null。