【问题标题】:How do I globally configure XML parsers against XXE?如何针对 XXE 全局配置 XML 解析器?
【发布时间】:2015-06-08 13:52:17
【问题描述】:

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

OWASP 文档详细解释了如何配置从DocumentBuilderFactory 返回的 XML 解析器以防止这种攻击,但我怎样才能将其设为默认值?

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

我已经看到DocumentBuilderFactory 支持javax.xml.parsers.DocumentBuilderFactory,但这对 Web 应用程序有什么作用?

【问题讨论】:

    标签: xml security web-applications


    【解决方案1】:

    您可以尝试编写您自定义的 DocumentBuilderFactory 并为javax.xml.parsers.DocumentBuilderFactory设置系统属性

    所以DocumentBuilderFactory.newInstance() 将返回您的自定义类

    参见文档DocumentsBuilderFactory#newInstance

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

    【讨论】:

    • 在与其他应用程序共享 VM 的 Web 应用程序中如何工作?我是否必须配置整个虚拟机,或者我可以以某种方式为每个应用配置它?
    【解决方案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

    但是下面的代码提供了很好的保护

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    dbf.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
    dbf.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");
    dbf.setAttribute(XMLConstants.FEATURE_SECURE_PROCESSING, Boolean.TRUE);
    dbf.setExpandEntityReferences(false);
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-01
      • 1970-01-01
      • 2015-11-19
      相关资源
      最近更新 更多