4

したがって、現在のプロジェクトでは、JAXB RI を Sun の JRE (Xerces だと思います) のデフォルトの Java パーサーで使用して、任意の 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 パーサーはリモート エンティティ (" http://somehost/foobar.dtd ") をロードしようとしますが、このスニペットは以前に 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 でアンマーシャリングする場合、問題の XML がそれらのリモート エンティティをロードせずに無効であると認識できる場合、基礎となる SAX パーサーによるリモート エンティティのロードを自動的に短絡する必要がありますか?

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

私はこれに比較的初心者なので、おそらく何かが欠けている可能性があります。もしそうなら教えてください!

4

1 に答える 1

4

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

注意すべき点:

  1. JAXBランタイムはXMLスキーマに依存していません。SAXパーサーを使用して、オブジェクトモデルへのバインドに使用するSAXイベントのストリームを生成します。このオブジェクトモデルは、手書きで作成することも、XJCを使用してスキーマから生成することもできますが、バインディングとランタイムは互いに非常に異なります。したがって、優れたXML入力は実行時にスキーマに準拠していることをご存知かもしれませんが、JAXBは準拠していません
  2. ランタイムにリモートDTD参照をロードさせることは、セキュリティホールを構成しません。最後に実際のDTDがある場合、最悪の場合は検証されないことです。実際のDTDでない場合は、無視されます。
  3. DTDは廃止されたと見なされているため、高レベルのJAXBAPIでは直接サポートされていません。が必要な場合はEntityResolver、すでに実行したSAXAPIを詳しく調べる必要があります。
  4. クラスモデルがXMLスキーマから生成された場合は、実行時にとを使用して、クラスモデルに対して検証することを検討する必要がSchemaFactoryありUnmarshaller.setSchema()ます。これにより、JAXBに渡される前にスキーマに対してSAXイベントを検証するようにXercesに指示されます。これにより、DTDのフェッチが停止することはありませんが、データが良好であることがわかっている安全層が追加されます。
于 2009-10-28T23:06:31.777 に答える