如何针对XXE全局配置XML解析器?

时间:2015-06-08 13:52:18

标签: xml security web-applications

用Java解析XML变得非常简单。大多数代码最终调用DocumentBuilderFactory.newInstance(),它返回一个易受XXE kind of attacks by default攻击的XML解析器。

OWASP文档详细解释了如何配置从DocumentBuilderFactory返回的XML解析器以防止此类攻击,但如何将其设置为默认值?

我的问题是我使用的是像JDOM2这样的库和其他处理XML的代码,我无法轻易更改所有这些代码。我如何将安全解析器设为默认解析器?

我已经看到DocumentBuilderFactory支持javax.xml.parsers.DocumentBuilderFactory,但这对网络应用程序有何影响?

2 个答案:

答案 0 :(得分:2)

请参阅http://web-in-security.blogspot.fr/2014/11/detecting-and-exploiting-xxe-in-saml.htmlhttps://www.owasp.org/index.php/XML_External_Entity_%28XXE%29_Prevention_Cheat_Sheet

但以下代码提供了良好的保护

final int totalHeight = scrollView_meaning.getChildAt(0).getHeight();

txt_word_meaning.getLocationInWindow(location);
int x = location[0];
y_position = location[1];
scrollView_meaning.post(new Runnable(){
     @Override
     public void run() {
            scrollView_meaning.scrollTo(60, y_position);
     }});

不确定XMLConstants.FEATURE_SECURE_PROCESSING的效果。它经常用dbf.setFeature记录,但并不是在所有版本的Xerces中都可用

答案 1 :(得分:1)

您可以尝试编写自定义的DocumentBuilderFactory 并设置javax.xml.parsers.DocumentBuilderFactory

的系统属性

因此DocumentBuilderFactory.newInstance()将返回您的自定义类

请参阅文档DocumentsBuilderFactory#newInstance

[编辑] 现在这会导致像Tomcat这样的Web容器出现问题,而这些容器不支持每个webapp的系统属性。这里的解决方案是设置容器的属性并将自定义工厂放在服务器的类路径上。这样,所有的webapp都会使用它 - 这可能就像你想要的那样重要的安全功能。