System.Xml のコーディング ガイドライン

更新 : November 2007

ここでは、System.Xml アプリケーションをセキュリティで保護するのに役立つ一般的なガイドラインについて説明します。

メモ :

System.Xml のコンポーネントは、Microsoft .NET Framework のセキュリティ システムに依存しています。このトピックでは、XML クラスによって処理されるセキュリティ上の問題だけを対象にしています。詳細については、「.NET Framework におけるセキュリティ」を参照してください。

セキュリティ上の問題

セキュリティ上の問題は、3 つの一般的なカテゴリに分類できます。

外部アクセス

いくつかの XML テクノロジには、処理中に他のドキュメントを取得する機能があります。たとえば、解析中のドキュメントにドキュメント型定義 (DTD) が存在する可能性があります。解析中のドキュメントによって参照されている外部ドキュメントにも、DTD が存在する可能性があります。XML スキーマ定義言語 (XSD) および XSLT テクノロジにも、他のファイルから情報を取り込む機能があります。これらの外部リソースで、セキュリティに関する注意事項が発生する可能性があります。

  • 信頼されたサイトからのファイルだけをアプリケーションで取得するにはどうすればよいでしょうか。たとえば、XML ドキュメントにインターネット上のファイルへのファイル参照がある場合、アプリケーションでそのファイルを取り込みますか。

  • ファイルを取り込む場合、悪意のあるデータがそのファイルに含まれていないことをどのように確認しますか。

サービス不能

XML ドキュメントには他のファイルへの参照を含めることが可能なため、XML ドキュメントの解析に必要な処理能力を確定することは困難です。たとえば、XML ドキュメントには DTD を含めることができます。DTD にネストされたエントリや複合コンテンツ モデルが含まれている場合、ドキュメントの解析に長い時間がかかることがあります。

次のシナリオは、サービス不能攻撃に対する脆弱性が低いと考えられます。これは、System.Xml クラスによって、そのような攻撃に対する保護手段が提供されるためです。System.Xml コンポーネントの使用時に発生する可能性のあるセキュリティ上の問題の種類と、それらの脅威を軽減するためにできることについて学習するには、「System.Xml のセキュリティに関する考慮事項」を参照してください。

  • テキスト XML データの解析。

  • バイナリ XML データが Microsoft SQL Server 2005 によって生成されている場合のバイナリ XML データの解析。

  • データ ソースからファイル システム、ストリーム、TextWriter、または StringBuilder への XML ドキュメントおよびフラグメントの書き込み。

  • XmlReader オブジェクトを使用し、ProhibitDtd が true に設定されている場合のドキュメント オブジェクト モデル (DOM) オブジェクトへのドキュメントの読み込み。

  • DOM オブジェクトの移動。

サービス不能攻撃の心配がある場合、または信頼できない環境を使用している場合、次のシナリオは推奨されません。

  • DTD 処理。

  • スキーマ処理。これには、信頼されていないスキーマのスキーマ コレクションへの追加、信頼されていないスキーマのコンパイル、および信頼されていないスキーマを使用した検証が含まれます。

  • XSLT 処理。

  • ユーザーから提供されたバイナリ XML データの任意のスリームの解析。

  • クエリ、編集、ドキュメント間でのサブツリーの移動、DOM オブジェクトの保存などの DOM 操作。

XmlReader を使用するときには、MaxCharactersInDocument プロパティを設定することで、解析可能なドキュメントのサイズを制限できます。エンティティの展開により生成される文字数を制限するには、MaxCharactersFromEntities プロパティを設定します。これらのプロパティの設定例については、該当するトピックを参照してください。

処理

XSD および XSLT テクノロジには、処理パフォーマンスに影響する可能性のある追加機能があります。たとえば、比較的小さなドキュメントの評価時に大量の時間を必要とする XML スキーマを作成することが可能です。また、XSLT スタイル シート内にスクリプト ブロックを埋め込むことも可能です。どちらも、アプリケーションにとってセキュリティ上の脅威になる可能性があります。

外部リソース

XmlUrlResolver クラスは、System.Xml 名前空間内のクラスすべての既定のリゾルバです。これは、XML ドキュメントの読み込みと、エンティティ、DTD またはスキーマ、import または include ディレクティブなど、外部リソースの解決に使用されます。

使用する XmlResolver オブジェクトを指定することによって、API でこれをオーバーライドできます。制御対象外の (信頼できない) リソースを開く場合には、XmlSecureResolver クラスを使用します。XmlSecureResolverXmlResolver をラップしたもので、元の XmlResolver がアクセスできるリソースを制限できます。

DTD 処理

DoS 問題に関する心配がある場合、または信頼されていないリソースを取り扱う場合は、DTD 処理を有効にしないでください。Create メソッドによって作成される XmlReader オブジェクトで、DTD 処理は既定で無効になっています。

メモ :

XmlTextReader では、DTD 処理が既定で許可されます。XmlTextReader.ProhibitDtd プロパティを使用してこの機能を無効にします。

DTD 処理を有効にした場合、XmlSecureResolver を使用して XmlReader でアクセス可能なリソースを制限できます。XML 処理がメモリおよび時間で制約されるように、アプリケーションを設計することもできます。たとえば、ASP.NET アプリケーション内でタイムアウト制限を設定します。

XSLT 処理

XslCompiledTransform クラスを使用するアプリケーションを作成するときには、次の項目とその関連事項に注意する必要があります。

  • XSLT スクリプトは既定で無効になっています。XSLT スクリプトは、スクリプトのサポートが必要であり、完全に信頼された環境で作業している場合のみ有効にします。

  • XSLT document() 関数は既定で無効になっています。document() 関数を有効にする場合は、XmlSecureResolver オブジェクトを Transform メソッドに渡すことによって、アクセス可能なオブジェクトを制限します。

  • 拡張オブジェクトは既定で有効になっています。拡張オブジェクトを含む XsltArgumentList オブジェクトが Transform メソッドに渡されると、拡張オブジェクトは使用されます。

  • XSLT スタイル シートには、他のファイルへの参照や埋め込みのスクリプト ブロックを含めることができます。悪意のあるユーザーがこれを悪用して、コンピュータがリソース不足に陥るまでシステムに処理を行わせようとするデータやスタイル シートを提供する可能性があります。

  • 混在信頼環境で動作する XSLT アプリケーションは、スタイル シートのなりすましを引き起こす可能性があります。たとえば、悪意のあるユーザーは、有害なスタイル シートを含むオブジェクトを読み込み、それを Transform メソッドを呼び出して変換を実行する別のユーザーに渡す可能性があります。

これらのセキュリティ上の問題は、スタイル シートが信頼されたソースからのものでない限り、スクリプトや document() 関数を有効にしないこと、および信頼されていないソースからの XslCompiledTransform オブジェクト、XSLT スタイル シート、または XML ソース データを受け入れないことによって軽減できます。

例外処理

下位レベルのコンポーネントによってスローされた例外が、アプリケーションにまでバブルしてパス情報を公開してしまうことがあります。アプリケーションは例外をキャッチし、それらを適切に処理する必要があります。

XmlTextWriter の使用方法

XmlTextWriter を別のアプリケーションに渡すと、下位のストリームがそのアプリケーションに公開されます。XmlTextWriter を信頼度の低いアプリケーションに渡す必要がある場合は、代わりに Create メソッドによって作成される XmlWriter オブジェクトを使用する必要があります。

参照

処理手順

方法 : XmlSecureResolver クラスの使用

その他の技術情報

セキュリティと System.Xml アプリケーション