在jdk1.6中,我正在设置
transformerFactory.setFeature(XMLConstants.ACCESS_EXTERNAL_DTD, false)
我遇到以下错误:
javax.xml.transform.TransformerConfigurationException:无法在此TransformerFactory上设置“http://javax.xml.XMLConstants/property/accessExternalDTD”功能。 在org.apache.xalan.processor.TransformerFactoryImpl.setFeature(TransformerFactoryImpl.java:418)
正如我在此处所发现的那样:How to prevent xalan.jar that has META-INF\services\javax.xml.transform.TransformerFactory from taking over JDK 1.6 built in Xalan implementation? 我无法在此处进行更改,因为我的管理员会审核其他API冲突。
根据此链接:http://xml.apache.org/xalan-j/features.html#domsource
您可以使用TransformerFactory.setFeature(String, boolean)
方法设置要素的值。 Xalan-Java仅支持XMLConstants.FEATURE_SECURE_PROCESSING
功能的设置。对于所有其他功能,TransformerFactory会公开其值,但不能更改其状态。
因此,如果使用TransormerFactory的xalan实现,我们似乎只能设置此功能。
transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
最后我的问题: 如果我们设置功能:
transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
然后另一个功能(XMLConstants.ACCESS_EXTERNAL_DTD
)自动设置为false
我从上面设置的日志中得到了上述功能“false”。
但我想确定默认情况下accessExternalDTD
功能是否设置为false,或者安全处理功能是否设置为true。
答案 0 :(得分:0)
当 XMLConstants.FEATURE_SECURE_PROCESSING 更新时,从源头看,其他功能似乎不会更新:
public void setFeature(String name, boolean value)
throws TransformerConfigurationException {
// feature name cannot be null
if (name == null) {
throw new NullPointerException(
XSLMessages.createMessage(
XSLTErrorResources.ER_SET_FEATURE_NULL_NAME, null));
}
// secure processing?
if (name.equals(XMLConstants.FEATURE_SECURE_PROCESSING)) {
m_isSecureProcessing = value;
}
// This implementation does not support the setting of a feature other than
// the secure processing feature.
else
{
throw new TransformerConfigurationException(
XSLMessages.createMessage(
XSLTErrorResources.ER_UNSUPPORTED_FEATURE,
new Object[] {name}));
}
}
所以看起来我需要找到另一种设置这种特性的方法 XMLConstants.ACCESS_EXTERNAL_DTD :(
答案 1 :(得分:0)
在Java 8中是。如果我们设置
TransformerFactory factory = TransformerFactory.newInstance();
factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
然后像owasp guide建议的那样,将属性ACCESS_EXTERNAL_DTD
,ACCESS_EXTERNAL_STYLESHEET
设置为""
。
我们可以使用以下方法进行验证:
Object hasExternalDtd=factory.getAttribute(XMLConstants.ACCESS_EXTERNAL_DTD);
Object hasExternalStyle=factory.getAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET);
设置FEATURE_SECURE_PROCESSING
功能后。
两个属性的默认值都是all
。