我的问题:
Fortify 4.2.1在代码下方标记为易受XML外部实体攻击。
TransformerFactory factory = TransformerFactory.newInstance();
StreamSource xslStream = new StreamSource(inputXSL);
Transformer transformer = factory.newTransformer(xslStream);
解决方案我尝试过:
将XMLConstants.FEATURE_SECURE_PROCESSING
的TransformerFactory功能设置为true。
研究为TransformerFactory提供更多此类功能的可能性,就像我们对DOM和SAX解析器一样。例如禁止doctype声明等。但TransformerFactoryImpl似乎并没有接受XMLConstants.FEATURE_SECURE_PROCESSING
的任何其他内容。 Impl Code
请指出您认为我可能没有经历的任何资源或此问题的可能解决方案。
答案 0 :(得分:2)
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
actory.setFeature("http://xml.org/sax/features/external-general-entities", false);
factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
我们可能需要更改为不同的解析器才能使用它们。
答案 1 :(得分:2)
由于市场上有许多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;
}
}