Web パーツ ページの保護
更新 : 2007 年 11 月
Web パーツは、エンド ユーザーが Web ページを変更またはパーソナル化できる ASP.NET の新しい機能です。Web ページをパーソナル化できることで Web アプリケーションがユーザーにとって有効で強力なものとなりますが、一方で開発者はセキュリティへの影響を理解する必要があります。
Web パーツ セキュリティの問題点
Web パーツは ASP.NET の機能で、Web パーツ コントロールは拡張された ASP.NET サーバー コントロールであるため、Web パーツ ページには ASP.NET ページとまったく同じリスクが発生する可能性があります。Web パーツ コントロールを使用するページを持つ Web アプリケーションは、実際には特殊化されただけの ASP.NET アプリケーションの一種です。このため、Web パーツを使用するアプリケーションは、通常の ASP.NET アプリケーションを実行できる任意の信頼レベルで実行できます。ASP.NET Web サイトのセキュリティに関する一般的な情報については、「ASP.NET Web サイトのセキュリティ」を参照してください。ただし、Web パーツには、通常の ASP.NET ページにはない固有のセキュリティ上の問題がいくつかあります。これらの問題点について、次の各セクションで説明します。
コントロール データのインポート
セキュリティ上最も大きなリスクを持つ Web パーツの機能は、インポート機能です。ユーザーはこの機能を使用して、サーバー コントロールの状態データおよびプロパティ データが格納された XML 記述ファイルをインポートできます (Web サーバー上でコントロールのアセンブリ ファイルが既に使用可能になっている必要があります)。コントロールのデータのインポートは、ユーザーがデータを共有し、複雑なコントロールを簡単に設定するための方法です。ただし、記述ファイルに有害データが存在する可能性があるという固有のリスクを持っています。たとえば、他のユーザーが悪意のあるスクリプト コードを文字列プロパティの値として記述ファイルに格納した場合、ユーザーがその記述ファイルをインポートし、参照されるこのサーバー コントロールを Web ページに追加したときに、スクリプトが実行される可能性があります。有害データを持った記述ファイルをインポートするリスクを最小限に抑えるため、文字列型のプロパティを持つサーバー コントロールでは常にプロパティ データをエンコードする必要があります。その他のリスクには、記述ファイルによる型のインポートがあります (「Web パーツ コントロール記述ファイル」を参照してください)。悪意のあるユーザーは、要求を送信して AppDomain に多くのアセンブリを読み込ませることで、過剰なメモリ量を消費させる場合があります。インポートに関連するリスクを回避したい場合、インポート機能を実装しているサーバー コントロールを使用しないようにするだけで、その機能を完全に無効にできます。または、そのコントロールにアクセスできるユーザーを制限します。たとえば、ロール管理を使用して、ユーザーが管理者のロールを持つ場合に、そのユーザーのページにプログラムにより ImportCatalogPart を追加できます。このコントロールの詳細については、ImportCatalogPart クラスのリファレンス トピックを参照してください。
コントロール データのエクスポート
エクスポート機能は重要情報の公開につながる可能性があるため、インポートと同程度のリスクがあります。ユーザーはエクスポートを使用して、特定のコントロールのプロパティ データおよび状態データを XML 記述ファイルに保存できます (これは、インポート機能によりインポートするファイルと同じです)。この場合の主なリスクは、ユーザーが重要情報をアプリケーションから記述ファイルにエクスポートする可能性があることです。記述ファイルは単純なテキスト ファイルであるため、適正なアクセス許可を持っているユーザーならだれでも読み取ることができます。ASP.NET ではエクスポートが既定で無効になっているため、この機能が不要な場合はこのままにしておいてかまいません。これが最も安全な方法です。
エクスポートを有効にする場合は、エクスポートできるプロパティを決定するオプションに注意する必要があります。WebPartZone ゾーン内で使用する WebPart コントロールまたはサーバー コントロールを作成する場合、エクスポートできるようにする各パブリック プロパティに対して、Personalizable メタデータ属性を追加できます。これによって、エクスポートを有効にするとそのプロパティをエクスポートできるようになり、データがエクスポートされることを警告するメッセージ ボックスがユーザーに表示されます。Personalizable 属性のパラメータの 1 つは、IsSensitive と呼ばれます。このブール値パラメータは、状況によってプロパティをエクスポートできるようにする場合に役立ちます。詳細と例については、ExportMode プロパティのリファレンス トピックを参照してください。
パーソナル化の詳細の理解
Web パーツのパーソナル化は、ユーザーがその目的に合うように Web ページを変更し、設定を長期ストレージに保存できる機能です。このため、パーソナル化されたページではブラウザ セッションを越えて設定が保持されます。パーソナル化は大部分の Web パーツ機能で必要となるため、Web パーツ コントロールを含むページでのみ使用する場合でも、ASP.NET Web サイトで既定で有効になります。パーソナル化はこのような強力な機能であるため、ある程度のリスクもあります。ユーザーは Web ページの実際のレイアウトと外観に加えて、内容や制御も変更できます。パーソナル化データはデータベースに格納されてページの表示に使用されるため、ユーザーがサイトの内容に関して悪意のある操作を実行する可能性が大いにあります。ユーザーはパーソナル化の共有スコープにアクセスし、すべてのユーザーに対してページを表示する方法さえも変更できます。
特定のページで Web パーツ機能を使用していてもパーソナル化する必要がない場合は (ポータル サイトの共通ページの 1 つなど)、パーソナル化を無効にすることをお勧めします。これにより、パフォーマンスが向上し、サイトのセキュリティ リスクが減少します。詳細については、「方法 : Web パーツのパーソナル化を無効にする」を参照してください。
パーソナル化に対するユーザーの認証
パーソナル化は認証されたユーザーが行う必要があります。匿名ユーザーに対してパーソナル化を有効にしないでください。つまり、パーソナル化と Web パーツ機能を完全に使用するには、Web サイトで Windows ベースの認証またはフォーム ベースの認証を使用する必要があることを意味します。認証オプションについては、「ASP.NET Web アプリケーションのセキュリティに関する基本的な対策」を参照してください。新しいメンバシップ機能 (フォーム認証を使用) を使用してサイトを設定するには、「メンバシップを使用したユーザーの管理」を参照してください。
共有されたパーソナル化に対する最小限のアクセス権の付与
Web パーツのパーソナル化による変更は、常に指定された範囲つまりスコープのユーザーに対して適用されます。ユーザー スコープで行われた変更が、変更を行ったユーザーに対してのみ表示されるのに対し、共有スコープで行われた変更はすべてのユーザーに表示されます。共有のパーソナル化スコープは、マネージャ ロールまたは管理者ロールのユーザーが、サイトのすべてのユーザーに対して適用するページを変更できるようにするためにあります。既定では、すべてのユーザーが共有スコープへのアクセスを拒否されます。選択したユーザーだけにアクセス権を付与するには、Web サイトの構成ファイルで明示的に行う必要があります。詳細については、「方法 : Web パーツ ページの共有パーソナル化を有効にする」を参照してください。
テスト済みの信頼されるコントロールの使用
Web パーツには、ページへの新しいサーバー コントロールの追加などの強力な機能がユーザーに用意されているため、開発者は、Web パーツ アプリケーション内でユーザーが使用するサーバー コントロールについて十分に注意を払う必要があります。特にサード パーティまたは販売元のサーバー コントロールについては、注意深く確認およびテストを行い、Web パーツ アプリケーションで信頼された状態で使用できるようにする必要があります。たとえば、特定のサーバー コントロールのデザイン品質が低く、効率的なメモリの使用ができないとします。このコントロールを Web パーツ カタログに追加すると、ユーザーはそれを Web ページに追加できます。また、カタログ内のコントロールは何度でもページに追加できるため (複数インスタンス)、ユーザーがパフォーマンスの低いコントロールを複数回追加すると、ページがそのコントロールの多数のインスタンスを処理しようとしたときにサービス拒否攻撃が発生する可能性があります。Web パーツ カタログの詳細については、CatalogPart クラスのリファレンス トピックを参照してください。
コントロールにおける承認およびフィルタ処理の使用
Web パーツには、Web パーツ ページのユーザー インターフェイス (UI) の作成に使用するサーバー コントロールの承認レベルを設定およびチェックできる機能が用意されています。設定した基準に基づいてコントロールが承認されると、それがページ上に表示されます。それが下位レベルで承認されるかまたは承認されないかに応じてその外観を変更したり、完全に非表示にしたりできます。たとえば、管理者として指定されたユーザーがいるとします。あるサーバー コントロールを管理者のみに表示する場合があります。Web パーツの承認機能とフィルタ処理機能を使用すると、指定した管理者にのみこのコントロールを表示し、その他のユーザーには非表示にすることができます。承認とフィルタ処理を使用するための主要なしくみでは、WebPart クラスの AuthorizationFilter プロパティ、および WebPartManager クラスの IsAuthorized メソッドおよび OnAuthorizeWebPart メソッドを使用します。
編集コントロールにおける文字列型のプロパティのエンコーディング
Web パーツ固有の機能の 1 つでは、エンド ユーザーがページを編集モードに切り替え、サーバー コントロールのレイアウト、外観、動作、およびパーソナル化できるプロパティ値を変更して編集できます。ただし、文字列型のプロパティを編集する機能を使用して、悪意を持ったユーザーが不適切なデータを挿入したり、スクリプト注入攻撃を試みたりできるため、ある程度のリスクがあります。セキュリティ対策として、カスタム EditorPart コントロールを作成してサーバー コントロールを編集する場合、および指定したサーバー コントロールのパーソナル化できる何らかのプロパティが文字列型であるかまたは文字列コンバータを使用する場合、EditorPart コントロールで文字列データをエンコードしてからそれをプロパティに割り当てる必要があります。例については HtmlEncode メソッドのリファレンス ドキュメントを参照してください。
参照
参照
System.Web.UI.Design.WebControls.WebParts