清理用户提供的XSLT

我们有一个应用程序,它使用XSLT格式化
XML数据以显示为XHTML.

系统能够处理任意XML模式,因此需要由系统用户上载模式和XSLT.显然,这是一项仅允许管理员级别用户执行的任务,但是这也是一个非常大的目标,所以我试图让它更安全.

我应该提到我们正在使用Saxon 9.0 B.

是否有任何标准的方法来清理用户提供的XSLT?到目前为止,我已经确定了三个可能的问题,虽然我很有意思,可能还有更多我根本没有想过的:

> xsl:import和document()函数可以在服务器文件系统中获取.这很容易使用自定义URI解析器锁定,所以我非常有信心我已经覆盖了这个
>输出可以包含javascript.我正在考虑使用像OWASP Anti-Samy这样的东西来列出允许的输出标签.
> XSLT可以调用java函数.这是目前令我头疼的问题.我不想完全关闭这个功能(虽然目前我甚至看不到怎么做),因为我们正在使用它.我首选的解决方案是能够锁定可接受的java命名空间,以便只能执行已知的安全功能.我对其他建议持开放态度.

黄金标准将是一个标准库,它只处理所有已知的基于XSLT的漏洞,但未能解决上面列出的问题(特别是3)的任何建议都会受到很大的关注.

提前致谢

最佳答案 Saxon有一个配置选项,可以禁用“自反”(动态加载)扩展功能.这并不妨碍使用已通过API在配置中明确注册的“集成”扩展功能.这似乎符合您允许服务提供商注册扩展功能的要求,但不允许样式表作者这样做.

如果需要,您可以通过定义自己的JavaExtensionFunctionFactory来控制扩展函数调用的绑定方式.这是相当低级的系统编程,您可能需要研究源代码以查看需要覆盖哪些方法以满足您的需求.

除了document()之外,还需要考虑collection(),unparsed-text(),xsl:result-document.在所有情况下都有Saxon钩子,可以控制行为.

点赞