XSLT のセキュリティに関する考慮事項
更新 : November 2007
XSLT 言語には、優れた性能と柔軟性を兼ね備えた豊富な機能が用意されています。ただし、多くの機能を利用できることが便利であると同時に、外部から不正に利用される可能性もあります。XSLT を安全に使用するために、XSLT の使用に伴うさまざまなセキュリティ上の問題とそのリスクを軽減するための基本的な対策を理解しておく必要があります。
XSLT 拡張機能
スタイル シート スクリプトと拡張オブジェクトの 2 つは、XSLT の一般的な拡張機能です。これらの拡張機能を使用すると、XSLT プロセッサでコードを実行できます。
拡張オブジェクトは、XSLT にプログラミング機能を追加します。
スクリプトは、拡張要素である msxsl:script 要素を使用してスタイル シートに埋め込むことができます。
拡張オブジェクト
拡張オブジェクトは、AddExtensionObject メソッドを使用して追加します。拡張オブジェクトをサポートするには、FullTrust アクセス許可セットが必要です。このアクセス許可セットを設定すれば、拡張オブジェクト コードの実行時にアクセス許可の昇格が起こりません。FullTrust アクセス許可なしで AddExtensionObject メソッドを呼び出そうとすると、セキュリティ例外がスローされます。
スタイル シート スクリプト
スクリプトは、msxsl:script 拡張要素を使用してスタイル シートに埋め込むことができます。スクリプトのサポートは、XslCompiledTransform クラス (既定で無効) のオプションの機能です。スクリプト機能を有効にするには、XsltSettings.EnableScript プロパティを true に設定して、XsltSettings オブジェクトを Load メソッドに渡します。
ガイドライン
スクリプト機能を有効にするのは、スタイル シートの作成元が信頼できる場合のみにしてください。スタイル シートの作成元が確認できない場合、またはスタイル シートの作成元が信頼できない場合には、XSLT 設定の引数に null を渡してください。
外部リソース
XSLT 言語には、xsl:import、xsl:include、または document() 関数などの機能があります。これらの機能では、プロセッサが URI リファレンスを解決する必要があります。外部リソースを解決するには、XmlResolver クラスを使用します。外部リソースの解決が必要になる可能性があるのは、次の 2 つの場合です。
スタイル シートをコンパイルする場合には、xsl:import および xsl:include を解決するために XmlResolver を使用します。
変換を実行する場合には、document() 関数を解決するために XmlResolver を使用します。
メモ : XslCompiledTransform クラスでは、document() 関数は既定で無効になっています。この機能を有効にするには、XsltSettings.EnableDocumentFunction プロパティを true に設定して、XsltSettings オブジェクトを Load メソッドに渡します。
Load および Transform メソッドには、XmlResolver を引数の 1 つとして許容するオーバーロードがそれぞれ含まれます。XmlResolver を指定しない場合は、資格情報を持たない既定の XmlUrlResolver が使用されます。
ガイドライン
document() 関数を有効にするのは、スタイル シートの作成元が信頼できる場合のみにしてください。
XmlResolver オブジェクトを使用する場合の説明を次の一覧に示します。
XSLT 処理で認証が必要なネットワーク リソースにアクセスする必要がある場合、必要な資格情報に対して XmlResolver を使用します。
XSLT 処理がアクセスできるリソースを制限する場合、適切なアクセス許可セットに対して XmlSecureResolver を使用します。制御対象外の (信頼できない) リソースを開く場合には、XmlSecureResolver クラスを使用します。
動作をカスタマイズする場合は、独自の XmlResolver クラスを実装し、これを使用してリソースを解決することができます。
外部リソースにアクセスできないようにする場合は、XmlResolver の引数に null を指定します。