2016-12-25 37 views
1

我看到,我們可以配置具有.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)實際上是做什麼的?

回答