私たちはこの機能はで文書化されて保護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)は実際に何をしますか?
しかし、.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING、true)を使用する目的は何ですか? –