gpt4 book ai didi

java - 是否可以避免使用 xalan TransformerFactory?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:27:47 28 4
gpt4 key购买 nike

我有以下代码:

final TransformerFactory factory = TransformerFactory.newInstance();

factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");

第二行在具有默认 TransformerFactory 的现代 JDK(我试过 1.8)中运行良好。但是当我将 xalan(版本 2.7.2,最新版本)添加到类路径时,我在第二行得到以下内容:

Exception in thread "main" java.lang.IllegalArgumentException: Not supported: http://javax.xml.XMLConstants/property/accessExternalDTD
at org.apache.xalan.processor.TransformerFactoryImpl.setAttribute(TransformerFactoryImpl.java:571)
at Main.main(Main.java:11)

我猜这是因为xalan的TransformerFactory不支持这个属性。 Xalan 的实现通过 ServiceLoader 机制获取:它在 xalan jar 的 services/javax.xml.transform.TransfomerFactory 中指定。

可以使用 javax.xml.transform.TransformerFactory 系统属性或 $JRE/lib/jaxp.properties 覆盖 TransformerFactory 实现code> 文件,或者直接在代码中传递类名。但要做到这一点,我必须提供一个具体的类名。现在,它是 com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl,但是在系统属性中对其进行硬编码有点可怕,因为在 JDK 升级时它们可以轻松地更改类名,我们只会得到一个运行时错误。

有什么方法可以指示 TransformerFactory.newInstance() 忽略 xalan 提供的实现吗?或者告诉它“只使用系统默认值”。

附言我不能只从类路径中删除 xalan,因为我们使用的许多其他库都依赖于它。

最佳答案

我在这里唯一可以实现的是硬编码 JDK 默认工厂并使用正常的发现过程作为后备:

TransformerFactory factory;
try {
//the open jdk implementation allows the disabling of the feature used for XXE
factory = TransformerFactory.newInstance("com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl", SecureXmlFactories.class.getClassLoader());
} catch (Exception | TransformerFactoryConfigurationError e) {
//this part uses the default implementation of in xalan 2.7.2
LOGGER.error("Cannot load default TransformerFactory, le's try the usual way", e);
//not advisable if you dont want your application to be vulnerable. If needed you can put null here.
factory = TransformerFactory.newInstance();

}

然后在try/catch下配置

// this works everywhere, but it does not disable accessing
// external DTDs... still enabling it just in case
try {
factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
} catch (TransformerConfigurationException e) {
LOGGER.error("Cannot enable secure processing", e);
}

// this does not work in Xalan 2.7.2
try {
factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
} catch (Exception e) {
LOGGER.error("Cannot disable external DTD access", e);
}
// this does not work in Xalan 2.7.2
try {
factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, "");
} catch (Exception e) {
LOGGER.error("Cannot disable external stylesheet access", e);
}

并监控日志以查看默认 JDK 工厂类名称是否/何时更改。

关于java - 是否可以避免使用 xalan TransformerFactory?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50000756/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com