在transformerFactory中设置FEATURE_SECURE_PROCESSING是否也更新了其他安全功能?

时间:2015-04-28 15:50:01

标签: java xerces xalan

在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。

2 个答案:

答案 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_DTDACCESS_EXTERNAL_STYLESHEET设置为""

我们可以使用以下方法进行验证:

Object hasExternalDtd=factory.getAttribute(XMLConstants.ACCESS_EXTERNAL_DTD);
Object hasExternalStyle=factory.getAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET);

设置FEATURE_SECURE_PROCESSING功能后。

两个属性的默认值都是all