.NET TIPS

[ASP.NET]途中ページへの直接アクセスを防ぐには?

山田 祥寛
2004/06/25

 別稿「TIPS:[ASP.NET]フォーム認証後に強制的に先頭ページへ誘導するには?」では、フォーム認証時に、ユーザーを先頭ページに誘導する方法について紹介した。しかし、この方法は(当然のことながら)フォーム認証を利用する場合にしか利用できない。また、あくまで認証時のリンク先を制御するだけなので、いったん認証を通過してしまった後は、ユーザーがどのページにアクセスするのも自由になってしまう。

 では、フォーム認証を必要としないページ(あるいは認証後のページ・アクセス)で同様の制御を実現するには、どのようにしたらよいだろうか。そこで本稿では、Global.asaxを利用して、ユーザーによる途中ページへの直接アクセスを防ぐ方法について紹介することにしよう。この方法は、Webアプリケーションの途中ページに付けたブックマーク(お気に入りに追加)などによって想定されていないページがアクセスされた場合に、それを先頭ページへリダイレクトする。

 なお、Global.asaxに関する詳細は、別稿「TIPS:[ASP.NET]アプリケーション共通のロギングを行うには?(Global.asax編)」でも紹介しているので、併せて参照してみてほしい。

 まず、今回紹介する方法を利用したサンプル・プログラムを示す。

<%@ Application Description="Insider .NET Sample" %>
<script Language="VB" runat="Server">
Sub Application_OnBeginRequest(sender As Object, e As EventArgs)
  Dim strTop As String = "/netIns/index.aspx"
  ' アクセス先がindex.aspx(先頭ページ)でない場合には、
  '以下の判定処理を行う
  If Request.FilePath <> strTop Then
    ' リンク元のページが空(直接アクセス)、または、ほかのホスト
    ' からリンクしてきた場合には、強制的にindex.aspxにリダイレクト
    Dim refUri As Uri = Request.UrlReferrer
    If refUri Is Nothing Then
      Response.Redirect(strTop)
    Else
      If Not refUri.AbsoluteUri.StartsWith("http://localhost/netIns") Then
        Response.Redirect(strTop)
      End If
    End If
  End If
End Sub
</script>
ユーザーによる途中ページへの直接アクセスを制御するGlobal.asax(VB.NET版)
 
<%@ Application Description="Insider .NET Sample" %>
<script Language="C#" runat="Server">
void Application_OnBeginRequest(Object sender, EventArgs e){
  String strTop = "/netIns/index.aspx";
  // アクセス先がindex.aspx(先頭ページ)でない場合には、
  //以下の判定処理を行う
  if(Request.FilePath != strTop) {
    Uri refUri = Request.UrlReferrer;
    // リンク元のページが空(直接アクセス)、または、ほかのホスト
    // からリンクしてきた場合には、強制的にindex.aspxにリダイレクト
    if (refUri == null) {
      Response.Redirect(strTop);
    } else {
      if (!refUri.AbsoluteUri.StartsWith("http://localhost/netIns")) {
        Response.Redirect(strTop);
      }
    }
  }
}
</script>
ユーザーによる途中ページへの直接アクセスを制御するGlobal.asax(C#版)

 コードの流れは単純だ。ユーザーが直接にサイトへアクセスしてきたかどうかを確認するには、HttpRequest.UrlRefererプロパティを利用すればよい。UrlRefererプロパティは、カレント・ページへのリンク元のURLを返す。つまり、UrlRefererプロパティが空文字列(当該ページに直接にアクセスしてきた)、あるいは、現在のアプリケーション・パスとは異なるURLを返した(偽造されたダミーのページからリンクされた)場合には、本来、アプリケーションが想定していたリンクとは異なるものと見なして、強制的に先頭ページ(今回の場合ではindex.aspx)へリダイレクトする。これによって、ユーザーによる途中ページへの直接アクセスを防ぐことができる。

 ただし、この方法も絶対的な信頼がおけるというわけではない点に注意してほしい。というのも、UrlRefererプロパティはクライアントがリクエスト時にセットしてきたリクエスト・ヘッダの内容を取得しているにすぎない。つまり、クライアント側で作為的にリクエスト・ヘッダを偽造していたら、これを防ぐ手段はないということだ。

 本稿で紹介した手法は、あくまで一時的なガードの手段であって(ほとんどのケースでは十分なガードであるにせよ)、絶対的なものではない点に注意すること。もしもリクエスト・ヘッダを改ざんするようなケースまでも防ごうとした場合には、セッション情報にアプリケーションの状態を管理するためのフラグを持たせるなどの施策が必要となる。End of Article

カテゴリ:Webフォーム 処理対象:認証
関連TIPS:[ASP.NET]フォーム認証後に強制的に先頭ページへ誘導するには?
関連TIPS:[ASP.NET]アプリケーション共通のロギングを行うには?(Global.asax編)
 
この記事と関連性の高い別の.NET TIPS
[ASP.NET]フォーム認証後に強制的に先頭ページへ誘導するには?
[ASP.NET]構成ファイルのみでフォーム認証を実現するには?
[ASP.NET]ページ単位にユーザーのアクセス可否を制御するには?
[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 記事ランキング

本日 月間