我看到我们可以使用.setFeature配置XMLReader(XMLConstants.FEATURE_SECURE_PROCESSING,true)
此功能通过以下方式记录:“用于安全处理的功能.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>");
首先,我收到了JAXP00010001错误:消息:JAXP00010001:解析器在本文档中遇到了超过“64000”的实体扩展;这是JDK强加的限制。将SECURE功能设置为false时,错误是相同的。
所以我设置了jvm arg:-Djdk.xml.entityExpansionLimit = 0,以禁用虚拟机的扩展限制。然后,使用SECURE_FEATURE重新运行测试为真。
但是现在,当我运行该程序时,它似乎没有受到这种攻击的保护,它只是继续运行。
我在jdk1.8.0_60下运行。
任何人都可以解释发生了什么? .setFeature(XMLConstants.FEATURE_SECURE_PROCESSING,true)实际上做了什么?
答案 0 :(得分:0)
嗯,根据https://docs.oracle.com/javase/tutorial/jaxp/limits/limits.html&#34;小于或等于0的值表示没有限制&#34;所以你需要设置&#34;一个正整数&#34;表示具体限制。