2016-12-25 4 views
1

私たちはこの機能はで文書化されて保護XMLパーサが

(真XMLConstants.FEATURE_SECURE_PROCESSING、).setFeatureとXMLReaderを設定することができることを見ました:「安全な処理のための機能を、真のXMLを処理するための実装を指示し。。

XMLReader reader = XMLReaderFactory.createXMLReader(); 
    reader.setContentHandler(handler); 
    reader.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); 
    reader.parse(input); 

、それにBILLIを与える:しっかりとこれは、サービス拒否攻撃などの条件を避けるために構築XMLに制限を設定することが 「

を私は次のコードでそれをテストしたかったです解析する攻撃笑上:

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

まあ、https://docs.oracle.com/javase/tutorial/jaxp/limits/limits.htmlによると "0以下の値は無制限を示します"ので、具体的な制限を示すには "正の整数"を設定する必要があります。

+0

しかし、.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING、true)を使用する目的は何ですか? –