8

我的问题:

Fortify 4.2.1 将以下代码标记为易受 XML 外部实体攻击。

TransformerFactory factory = TransformerFactory.newInstance();
StreamSource xslStream = new StreamSource(inputXSL);
Transformer transformer = factory.newTransformer(xslStream);

我尝试过的解决方案:

  1. 将 TransformerFactory 功能设置为XMLConstants.FEATURE_SECURE_PROCESSINGtrue。

  2. 研究为 TransformerFactory 提供更多此类功能的可能性,就像我们为 DOM 和 SAX 解析器所做的那样。例如,不允许 doctype 声明等。但 TransformerFactoryImpl 似乎不接受任何其他XMLConstants.FEATURE_SECURE_PROCESSING. 实现代码

请指出您认为我可能没有经历过的任何资源或可能解决此问题的方法。

4

2 回答 2

9
TransformerFactory trfactory = TransformerFactory.newInstance();
trfactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
trfactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
trfactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, "");

我认为这就足够了。

Fortify 会建议以下功能,但这些功能不适用于 TransformerFactory

factory.setFeature("http://xml.org/sax/features/external-general-entities", false);
factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);

我们可能需要更改为不同的解析器才能使用它们。

于 2017-08-04T09:55:26.843 回答
4

由于市场上有很多 xml 解析引擎,每个引擎都有自己的机制来禁用外部实体注入。请参阅您的引擎的文档。下面是使用 SAX 解析器时防止它的示例。

基础是不允许 DOCTYPE 声明。但是,如果需要禁用外部通用实体和外部参数实体,则不会欺骗底层 SAX 解析器进行 XXE 注入。

public class MyDocumentBuilderFactory{

    public static DocumentBuilderFactory newDocumentBuilderFactory(){

        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();

        try{

            documentBuilderFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl",true);
            documentBuilderFactory.setFeature("http://xml.org/sax/features/external-general-entities",false);
            documentBuilderFactory.setFeature("http://xml.org/sax/features/external-parameter-entities",false);

        }catch(ParserConfigurationException exp){
            exp.printStackTrace();
        }

        return documentBuilderFactory;
    }
}
于 2018-06-29T06:49:41.037 回答