.NET TIPS

[ASP.NET]特定の拡張子に対するアクセスを制限するには?

山田 祥寛
2004/02/06

 例えば、拡張子が「.xml」や「.txt」「.ini」「.log」「.dat」などのファイルには、アプリケーション内で使用する諸データやユーザー・カスタムの設定情報などが含まれるケースが少なくない。そして、その多くの場合において、これらのファイルが不特定多数のユーザーによって参照されることは好ましくない。

 なぜなら、設定情報には、時として内部的に利用されるリソースやデータベース接続のための情報(ユーザーIDやパスワードなど)が含まれている可能性があるし、アクセス・ログのようなデータにせよ、内部的に発生したエラーや警告情報などからアプリケーションのセキュリティ・ホールを探る手掛かりになる場合があるからだ。あるいは、自分のサイト(アプリケーション)はそのような危ぐとは無縁だという方もいるかもしれない。しかし、セキュリティの保持とは「危険だから隠す」というよりも、「必要ないものは見せない」「不要な行動はさせない」というところから始まるのだと筆者は考える。

 本稿では、このような内部的に使用することを想定した拡張子について、HTTP経由でのアクセスを禁止する方法について紹介する。特別なコーディングは必要ない。例えば、アプリケーション配下の「.xml」「.txt」ファイルに対するユーザー・アクセスを制限したい場合には、IISに対して「TIPS:[ASP.NET].htmlや.pdfファイルをフォーム認証やロギングの対象にするには?」で紹介した設定を施したうえで、構成ファイル(machine.configまたはweb.config)に対して、以下のような記述を行えばよい(「.txt」や「.xml」のようにASP.NETで直接に処理されない拡張子の場合は、構成ファイルの定義のみでは設定は有効にならない)。

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
  <system.web>
    <httpHandlers>
      <add verb="*" path="*.txt" type="System.Web.HttpForbiddenHandler" />
      <add verb="*" path="*.xml" type="System.Web.HttpForbiddenHandler" />
    </httpHandlers>
  </system.web>
</configuration>
「.xml」「.txt」ファイルに対して、HTTP経由でのアクセスを禁止するための構成ファイル(web.config)

 <httpHandlers>要素は、指定された拡張子とHTTPハンドラ・クラスをマッピングするための要素だ。HTTPハンドラ・クラスとは、IISに対してクライアントから要求があった場合に、実際のリクエスト処理を行うためのクラスで、例えばおなじみの「.aspx」ファイルも内部的にはHTTPハンドラ・クラスによって処理されている。ASP.NETにかかわるすべてのリクエストは、aspnet_isapi.dllを介して、それぞれ該当するHTTPハンドラ・クラスに振り分けられると考えればよい。

 ASP.NETの挙動に必要最低限のHTTPハンドラ・クラスは、デフォルトでmachine.configに設定されているので、一般的な用途において、ユーザーがHTTPハンドラ・クラスを意識する必要はないだろう。しかし、ASP.NETに対して特別な制御をさせたいといった場合、ユーザーは、上記例のように<add>要素によって任意のHTTPハンドラ・クラスを追加することができる。<add>要素に指定可能な属性の意味は、以下のとおりだ。

属性 概要
verb HTTPメソッドのカンマ区切りリスト(例えば、"GET,HEAD"など)。ただし、HTTPメソッドにかかわらず、HTTPハンドラ・クラスを呼び出す場合には、ワイルドカード「*」を指定することもできる
path URLパス(ワイルドカードも使用可能。例えば、「*.aspx」など)
type カンマ区切りのクラスとアセンブリのセット
validate(省略可能) スタートアップ時にクラスを起動するかどうか(trueまたはfalse)。false設定時には、HTTPハンドラ・クラスは実際に該当するリクエストが発生するまで呼び出されない。つまり、これによってエラー処理が遅延する可能性はあるが、その分、スタートアップ時間は短縮される
要素で利用可能な属性

 上のサンプルでtype属性に指定されているSystem.Web.HttpForbiddenHandlerクラスは、ASP.NETにあらかじめ用意されているHTTPハンドラ・クラスで、クライアントの要求に対して「アクセス禁止」エラーを応答する。つまり、「.txt」や「.xml」などのファイルに対して、ユーザーが直接のリクエストを行ったとしても参照することができない。

「アクセス禁止」エラー・ページ
「.txt」ファイルへのアクセスを禁止している場合に、ユーザーが「sample.txt」にアクセスしたときにはこのエラー・ページが表示される。

 ちなみに、ASP.NETには汎用的に利用できるHTTPハンドラ・クラスとして、主に次のようなものが挙げられる。

HTTPハンドラ・クラス 概要
System.Web.UI.PageHandlerFactory ASP.NETページの処理を行う
System.Web.Handlers.TraceHandler アプリケーション・トレースを表示
System.Web.HttpMethodNotAllowedHandle HTTPメソッドが使用できない旨をエラー表示
System.Web.StaticFileHandler 指定されたファイルのソース・コードをそのまま表示
ASP.NETに標準で用意されているHTTPハンドラ・クラス

 例えば、ASP.NETのWebフォームを処理するには「.aspx」ファイルを一般的には利用するが、「.html」ファイルがASP.NETページを表すように関連付けることもできる。これによって、ASP.NETが利用されているという事実を隠ぺいでき、サイトに対する攻撃の抑止といった効果も期待できるだろう。

 また、HTTPハンドラ・クラスは開発者自身で構築することも可能である。これについては、別稿「TIPS:[ASP.NET]ASP.NETアプリケーションに独自の拡張子を追加するには? 」にて紹介している。End of Article

カテゴリ:Webフォーム 処理対象:構成ファイル
使用キーワード:<httpHandlers>要素
関連TIPS:.htmlや.pdfファイルをフォーム認証やロギングの対象にするには?
 
この記事と関連性の高い別の.NET TIPS
[ASP.NET]ASP.NETアプリケーションに独自の拡張子を追加するには?
[ASP.NET]アプリケーションにログ参照のユーティリティを追加するには?
[ASP.NET]動的にJPEG画像を作成するには?
[ASP.NET]特定のサービスを無効にするには?
[ASP.NET]ユーザーから入力されたデータを任意のあて先にメールするには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間