デフォルトのサックスパーサーを使用している場合、jaxbは細工されたxmlによって非整列化可能ですか?

StackOverflow https://stackoverflow.com/questions/1638528

  •  08-07-2019
  •  | 
  •  

質問

したがって、私の現在のプロジェクトでは、JAXB RIとSunのJREのデフォルトのJavaパーサー(Xercesであると思われます)を使用して、任意のXMLを非整列化します。

まず、XJCを使用して次の形式のXSDをコンパイルします。

<?xml version="1.0" encoding="utf-8" ?> 
<xs:schema attributeFormDefault="unqualified" 
elementFormDefault="qualified" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xs:element name="foobar">
...
</xs:element> 
</xs:schema>

「良いケース」ではすべてが設計どおりに機能します。つまり、このスキーマに準拠するXMLが渡された場合、JAXBはそれをオブジェクトツリーに正しく非整列化します。

問題は、外部DTD参照を使用してXMLを渡すときに発生します。例:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foobar SYSTEM "http://blahblahblah/foobar.dtd">
<foobar></foobar>

このようなものをアンマーシャリングすると、SAXパーサーはリモートエンティティ(&quot; http:// somehost / foobarをロードしようとします。 .dtd &quot;)このスニペットは、XJCで以前にコンパイルしたスキーマに明らかに準拠していないという事実にもかかわらず。

この動作を回避するために、準拠するXML(コンパイルしたXSDに準拠)はリモートエンティティの読み込みを必要としないことを知っているため、すべてのリモートの読み込みを短絡するカスタムEntityResolverを定義する必要がありますエンティティ。そのため、次のようなことを行う代わりに:

MyClass foo = (MyClass) myJAXBContext.createUnmarshaller().unmarshal(myReader);

これを強制されます:

XMLReader myXMLReader = mySAXParser.getXMLReader();
myXMLReader.setEntityResolver(myCustomEntityResolver);
SAXSource mySAXSource = new SAXSource(myXMLReader, new InputSource(myReader));
MyClass foo = (MyClass) myJAXBContext.createUnmarshaller().unmarshal(mySAXSource);

だから私の究極の質問は:

JAXBでアンマーシャリングする場合、基になるSAXパーサーによるリモートエンティティの読み込みは、それらのリモートエンティティの読み込みなしで問題のXMLが無効と認識できる場合、自動的に短絡する必要がありますか

また、これはセキュリティ上の問題のように見えませんか? JAX-WSが内部のJAXBに依存していることを考えると、特別に細工されたXMLをJAX-WSベースのWebサービスに渡して、WSホストに任意のURLをロードさせることができるようです。

私はこれに比較的慣れていないので、おそらく何か足りないことがあります。その場合はお知らせください!

役に立ちましたか?

解決

よく練られた質問、答えに値する:)

注意事項:

  1. JAXBランタイムはXMLスキーマに依存しません。 SAXパーサーを使用して、オブジェクトモデルにバインドするために使用するSAXイベントのストリームを生成します。このオブジェクトモデルは、手書きすることも、XJCを使用してスキーマから生成することもできますが、バインディングとランタイムは互いに非常に異なります。したがって、あなたは実行時に適切なXML入力がスキーマに準拠していることを知っているかもしれませんが、JAXBはそうではありません。
  2. ランタイムに強制的にリモートDTD参照をロードすることは、セキュリティホールを構成しません。最後に実際のDTDがある場合、最悪のケースは検証されないことです。実際のDTDではない場合、無視されます。
  3. DTDは時代遅れであると考えられているため、高レベルJAXB APIでの直接のサポートはありません。 EntityResolver が必要な場合は、すでに行ったSAX APIを掘り下げる必要があります。
  4. クラスモデルがXMLスキーマから生成された場合、 SchemaFactory および Unmarshaller.setSchema()を使用して、実行時にそのモデルを検証することを検討する必要があります。これにより、Xercesは、JAXBに渡される前にスキーマに対してSAXイベントを検証するように指示されます。これにより、DTDの取得が停止することはありませんが、データが適切であることを知っている安全性の層が追加されます。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top