私はXXE(外部XMLエンティティ)注入を防ぐXML検証を実装しています。 OWASP XXE Prevention Cheat Sheetからコードを借りました。私のコードは次のようになります。jboss-deployment-structure.xml JAXP除外を追加
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = factory.newSchema(xsdFileURL);
Validator validator = schema.newValidator();
validator.setProperty(XMLConstants.ACCESS_EXTERNAL_DTD, "");
validator.setProperty(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");
validator.validate(new StreamSource(new StringReader(xml)));
コードは私のローカルWindowsマシン(JDK 1.8.0_92、Wildfly 8.2)で正しく動作します。しかし、同様の設定(JDK - 1.8.0_101、Wildfly 8.2)とQA Red Hatのマシン上で、それはメッセージで例外をスローします - いくつかは、私の疑惑を読んだ後
Property 'http://javax.xml.XMLConstants/property/accessExternalDTD' is not recognized.
ことは、実行時にあり、間違ったクラスvalidator
クラスの定義が読み込まれています。これをどうやって解決するのですか?
更新
は、JBossがJAXP
の独自の実装が付属して判明し、私のコードは、JDKからといないのJBossからJAXPの実装を選択する必要があります。
java -jar jboss-modules.jar -jaxpmodule "javax.xml.jaxp-provider"
しかし、私はこの使用してのjboss-展開するstructure.xmlを行いたいのですが - 私はstandalone.sh
で-jaxpmodule
引数を渡すことで、これを簡単に行うことができます(これを使用して、私のコードは、同様に正しいJAXPの実装を選びました)と、このような除外を追加 -
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<deployment>
<exclusions>
<module name="javax.api" /> // is the module name correct?
</exclusions>
</deployment>
</jboss-deployment-structure>
しかし、これは動作していない、私はこれをどのように修正することができますか?
javax.xml.bind.apiまたはcom.sun.xml.bindモジュールを除外してはいけませんか? –
私はXMLを解析するので、私は 'JAXP'を使用しています。 AFAIK JAXBは、XML文書をJavaオブジェクトモデルにバインドするために使用されます。 –
また、 '-jaxpmodule'引数を使用すると、jboss-modules.jarで 'JAXP'モジュールの実装を指定できます。その他の 'JBoss'モジュールにはこのような議論はありません。これは、JAXPの実装をコマンドライン経由で指定することを意図しているのでしょうか? –