我看到,我們可以配置具有.setFeature一個XMLReader(XMLConstants.FEATURE_SECURE_PROCESSING,真)保護XML解析器
此功能記載:「功能進行安全處理真正的指示來處理XML的實現。安全地XML結構,以避免如拒絕服務攻擊的條件,這可能設限 「
我想用下面的代碼進行測試:
XMLReader reader = XMLReaderFactory.createXMLReader();
reader.setContentHandler(handler);
reader.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
reader.parse(input);
,並給它的Billi上笑進攻解析:
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重新運行測試爲true。
但現在,當我運行該程序時,它似乎不受此攻擊的保護,它只是繼續運行。
我在jdk1.8.0_60下運行。
任何人都可以解釋發生了什麼? .setFeature(XMLConstants.FEATURE_SECURE_PROCESSING,true)實際上是做什麼的?
好的,但是使用.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING,true)的目的是什麼呢? –