如何在保持安全性的同时提供 XSLT 实用程序
How to provide a utility on XSLT while maintaining security
我希望能够提供可在 XSL 样式表中使用的转义实用程序。例如:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xalan="http://xml.apache.org/xalan"
xmlns:escape="xalan://com.example.myservice.MyEscapeTool">
但是,就 Java 而言,我的理解是您的 TransformerFactory 缺少以下设置可能是不安全的:
factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
所以我这样做了,但可以理解的是,这会阻止您使用 "external function calls" 并出现以下运行时错误:
FATAL: XPath syntax error at char 12 in {escape:new()}:
Cannot find a matching 0-argument function named
{java:com.example.myservice.MyEscapeTool}new(). Note: external
function calls have been disabled;
删除上述 FEATURE_SECURE_PROCESSING 标志将解决问题。
我怎样才能包含一个可以在 XSLT 中调用的实用函数,同时又不会因为能够公开任意 Java class 而导致安全性损失?
正如@MartinHonnen 在他的评论中指出的那样,如果您切换到使用 Saxon,那么您可以将样式表限制为仅使用 "integrated extension functions",这些样式表在执行之前已在 XSLT 处理器中注册,而不允许样式表调用恰好在类路径上的任何 class/method。
我希望能够提供可在 XSL 样式表中使用的转义实用程序。例如:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xalan="http://xml.apache.org/xalan"
xmlns:escape="xalan://com.example.myservice.MyEscapeTool">
但是,就 Java 而言,我的理解是您的 TransformerFactory 缺少以下设置可能是不安全的:
factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
所以我这样做了,但可以理解的是,这会阻止您使用 "external function calls" 并出现以下运行时错误:
FATAL: XPath syntax error at char 12 in {escape:new()}:
Cannot find a matching 0-argument function named
{java:com.example.myservice.MyEscapeTool}new(). Note: external
function calls have been disabled;
删除上述 FEATURE_SECURE_PROCESSING 标志将解决问题。
我怎样才能包含一个可以在 XSLT 中调用的实用函数,同时又不会因为能够公开任意 Java class 而导致安全性损失?
正如@MartinHonnen 在他的评论中指出的那样,如果您切换到使用 Saxon,那么您可以将样式表限制为仅使用 "integrated extension functions",这些样式表在执行之前已在 XSLT 处理器中注册,而不允许样式表调用恰好在类路径上的任何 class/method。