在TransformerFactory中设置FEATURE_SECURE_PROCESSING是否还会更新其他安全功能?

Kar*_*yan 7 java xerces xalan

在jdk1.6中,当我设置

transformerFactory.setFeature(XMLConstants.ACCESS_EXTERNAL_DTD, false)
Run Code Online (Sandbox Code Playgroud)

我遇到以下错误:

javax.xml.transform.TransformerConfigurationException:无法在此TransformerFactory上设置功能' http://javax.xml.XMLConstants/property/accessExternalDTD '。在org.apache.xalan.processor.TransformerFactoryImpl.setFeature(TransformerFactoryImpl.java:418)

就像我在这里找到的一样:如何防止具有META-INF \ services \ javax.xml.transform.TransformerFactory的xalan.jar接管Xalan实现中内置的JDK 1.6? 我无法进行此处建议的更改,因为管理员还会查看其他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);
Run Code Online (Sandbox Code Playgroud)

最后我的问题:如果我们设置功能:

transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
Run Code Online (Sandbox Code Playgroud)

然后是另一个功能(XMLConstants.ACCESS_EXTERNAL_DTD)自动设置为false。
我从设置的日志中获得了上述功能“ false”。但是我想确定是否accessExternalDTD默认将功能设置为false或将安全处理功能设置为true。

SHo*_*oko 6

在 Java 8 中是的。如果我们设置

TransformerFactory factory = TransformerFactory.newInstance();
factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
Run Code Online (Sandbox Code Playgroud)

然后将属性ACCESS_EXTERNAL_DTD设置ACCESS_EXTERNAL_STYLESHEETowasp 指南""推荐的那样。

我们可以通过以下方式验证:

Object hasExternalDtd=factory.getAttribute(XMLConstants.ACCESS_EXTERNAL_DTD);
Object hasExternalStyle=factory.getAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET);
Run Code Online (Sandbox Code Playgroud)

设置该功能后FEATURE_SECURE_PROCESSING

如果我们不设置默认值,则这all两个属性都适用。


Kar*_*yan 1

从源代码来看,更新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}));
}
}
Run Code Online (Sandbox Code Playgroud)

所以看来我需要找到另一种方法来设置此功能XMLConstants.ACCESS_EXTERNAL_DTD :(