URI 名を持つ外部 XML リソースの解決
XmlResolver は、URI を使用して名前が付けられている外部 XML リソースを特定するための抽象クラスです。XmlResolver クラスは、以下のクラスで使用されます。
- XmlTextReader。XML ドキュメントと外部 DTD の読み込みに使います。
- XmlValidatingReader。XML ドキュメント、外部 DTD、エンティティ、およびスキーマの読み込みに使います。
- XmlDocument。XML ドキュメント、外部 DTD、およびエンティティの読み込みに使います。
- XmlSchema。
<xs:include>
要素と<xs:import>
要素の処理に使います。 - XmlSchemaCollection。
<xs:include>
要素と<xs:import>
要素の処理に使います。 - XslTransform。スタイル シートの読み込み、スタイル シートにある
<xsl:include>
要素または<xsl:import>
要素の処理、およびスタイル シートにあるdocument()
関数の解決に使います。
XmlResolver クラスを使用すると、ファイル システムや Web サーバーなど、任意のデータ リソースにある XML リソースを解決できます。XmlResolver の各種の具象実装は、リソースとの接続に関する処理全般を行います。具体的には、セキュリティ資格情報を処理したり、データ ソースとの接続を開いたり、リソースをストリームやオブジェクト型の形式にして返したりします。
XmlUrlResolver クラスは、XmlResolver の URL 用の具象実装です。このクラスを使用すると、file://
、http://
、https://
の各プロトコルを使用する XML リソースを解決できます。
.NET Framework Version 1.1 で実装されている XmlSecureResolver は、XmlResolver のもう 1 つの具象実装です。XmlSecureResolver は、XmlResolver の任意の具象実装をラップし、セキュリティ アクセス許可の機能を利用して、基になる XmlResolver によるリソースへのアクセスを制限するために使います。たとえば、XmlSecureResolver には、埋め込み URI 参照によって発生するドメイン間リダイレクトを禁止する機能があります。
XmlSecureResolver 派生クラスを使用すると、目的のリソースだけにアクセスを許可するように PermissionSet を設定できます。適切なセキュリティ アクセス許可を設定することで、.NET セキュリティ モデルに準拠していないリソースには、基になる XmlResolver がアクセスできなくなります。
.NET Framework Version 1.1 では、XmlSecureResolver にはオーバーロードされたコンストラクタが 3 つあります。引数に XmlResolver と Evidence を指定するもの、XmlResolver と PermissionSet を指定するもの、XmlResolver と URI 文字列を指定するものの 3 つです。
PermissionSet 引数を指定しないメソッドでは、Evidence または URI を使用して PermissionSet が計算され、基になる XmlResolver に割り当てられます。XmlSecureResolver の適切な PermissionSet がわかっている場合や、独自に設定した PermissionSet を使用する場合は、3 つ目のオーバーロードされたメソッドを使用して、目的の PermissionSet を基になる XmlResolver に直接割り当てます。オーバーロードされた XmlSecureResolver メソッドの詳細については、「XmlSecureResolver コンストラクタ」を参照してください。
XML リソースの絶対 URI の検索
相対 URI とベース URI がある場合は、XmlResolver クラスの ResolveUri メソッドを呼び出して、リソースの絶対 URI を取得できます。ベース URI と解決対象の URI を指定して XmlResolver.ResolveUri メソッドを呼び出すことにより、絶対 URI が返されます。絶対 URI の取得後は、XmlResolver の GetEntity メソッドを呼び出して、URI で指定されているリソースにアクセスできます。GetEntity メソッドは、絶対 URI を使用してリソースを検索し、そのストリーム オブジェクトを返します。
変換に使用されるリソースのリゾルバによる検索と XslTransform クラス
XSLT スタイル シートに <xsl:import>
タグか <xsl:include>
タグ、または document()
関数が含まれている場合は、外部リソースを検索するために XmlResolver 実装が使用されます。
XslTransform xslt = new XslTransform();
xslt.Load("http://webdata/global/xmlweb.xsl", new XmlUrlResolver());
xmlweb.xsl スタイル シートのコンパイル中に、XslTransform が次のようなインクルード要素を見つけたとします。
<xsl:include href="managed.xsl"/">
これによって、XslTransform は、次のような呼び出しを行います。
Uri fulluri = this.XmlResolver.ResolveUri("http://webdata/global/xmlweb.xsl",
"managed.xsl");
if (fulluri != null) {
Stream s = (Stream)this.XmlResolver.GetEntity(fulluri, null,
typeof(Stream));
}
新しいストリームが返され、そのストリームは XmlTextReader にラップされて、インクルードされたスタイル シートのコンパイルが続行されます。XslTransform クラスは、最初に Load メソッドで指定された XmlResolver インスタンスを引き渡して、XmlTextReader が同じセキュリティ権限でリソースを解決できるようにしています。
[C#]
XmlTextReader reader = new XmlTextReader(s, fulluri);
reader.XmlResolver = this.XmlResolver;
while (reader.Read())
{ . . .}
.NET Framework Version 1.1 では、ゾーン間のリダイレクトを禁止する場合、または URI で指定される特定の XSLT スタイル シートへのアクセスを禁止する場合には、マシンのセキュリティ ポリシーを適切に設定し、XmlSecureResolver を XslTransform クラスの Load メソッドと Transform メソッドに指定します。.NET Framework Version 1.0 では、ゾーン間またはドメイン間のリダイレクトを禁止する手段はありません。つまり、外部エンティティなどを参照している includes
や imports
によってリダイレクトが発生するような埋め込み URI があると、データやサイトのセキュリティを一切チェックせずに、データが読み込まれてしまうことになります。これは、リダイレクト時に資格情報が渡されないことが原因であり、安全でないサイトや匿名サイトからデータが取得されることによって、スタイル シートのセキュリティが低下する場合があります。
参照
XmlResolver を使用したリソースの解決 | ファイルからの読み取り時の XmlResolver への資格情報の提供 | カスタム リゾルバの作成