设置transformerFactory中的FEATURE_SECURE_PROCESSING会更新其他安全功能吗?

12
在jdk1.6中,当我设置
transformerFactory.setFeature(XMLConstants.ACCESS_EXTERNAL_DTD, false)

我遇到了以下错误:
javax.xml.transform.TransformerConfigurationException: 无法在此TransformerFactory上设置特性 'http://javax.xml.XMLConstants/property/accessExternalDTD'。
根据我在这里找到的信息:如何防止具有META-INF\services\javax.xml.transform.TransformerFactory的xalan.jar接管JDK 1.6内置的Xalan实现?,我无法按照建议进行更改,因为我的管理员已经审查过其他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个回答

6
在Java 8中是可以的。如果我们设置
TransformerFactory factory = TransformerFactory.newInstance();
factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);

接着,根据OWASP指南的建议,将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


1
factory.getFeature() 对我有用,而不是 factory.getAttribute()。 - Bhushan Karmarkar

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}));
}
}

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


1
你找到另一种方法了吗? - doughgle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接