保护XML解析器免受XEE攻击

保护XML解析器免受XEE攻击,xml,security,Xml,Security,我看到我们可以用.setFeature(xmlcants.FEATURE\u SECURE\u PROCESSING,true)配置一个XMLReader 此功能的文档记录为:“用于安全处理的功能。true指示实现安全地处理XML。这可能会对XML构造设置限制,以避免拒绝服务攻击等情况。 " 我想用以下代码测试它: XMLReader reader = XMLReaderFactory.createXMLReader(); reader.setContentHandler(han

我看到我们可以用.setFeature(xmlcants.FEATURE\u SECURE\u PROCESSING,true)配置一个XMLReader

此功能的文档记录为:“用于安全处理的功能。true指示实现安全地处理XML。这可能会对XML构造设置限制,以避免拒绝服务攻击等情况。 "

我想用以下代码测试它:

    XMLReader reader = XMLReaderFactory.createXMLReader();
    reader.setContentHandler(handler);
    reader.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
    reader.parse(input);
给它十亿次笑声来解析:

    String DOS = new String("<?xml version=\"1.0\"?>\n<!DOCTYPE lolz [\n<!ENTITY lol \"lol\">\n<!ELEMENT lolz (#PCDATA)>\n<!ENTITY lol1 \"&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;\">\n<!ENTITY lol2 \"&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;\">\n<!ENTITY lol3 \"&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;\">\n<!ENTITY lol4 \"&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;\">\n<!ENTITY lol5 \"&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;\">\n<!ENTITY lol6 \"&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;\">\n<!ENTITY lol7 \"&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;\">\n<!ENTITY lol8 \"&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;\">\n<!ENTITY lol9 \"&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;\">\n]>\n<lolz>&lol9;</lolz>");
stringdos=newstring(“\n\n\n\n\n\n\n\n\n]>\n&lol9;”);
首先,我得到了JAXP0010001错误:消息:JAXP0010001:解析器在本文档中遇到了超过“64000”个实体扩展;这是JDK施加的限制。将安全特性设置为false时,错误是相同的

因此,我设置了jvm参数:-Djdk.xml.entityExpansionLimit=0,以禁用虚拟机的扩展限制。然后,重新运行测试,并将SECURE_功能设置为true

但是现在,当我运行这个程序时,它似乎没有受到这种攻击的保护,它只是继续运行

我在jdk1.8.060下运行


有人能解释发生了什么吗?.setFeature(xmlcants.FEATURE\u SECURE\u PROCESSING,true)实际上做什么?

根据“小于或等于0的值表示没有限制”,所以需要设置“正整数”来表示具体限制。

好的,但是使用.setFeature(xmlcants.FEATURE\u SECURE\u PROCESSING,true)的目的是什么?