サンプル
Global.asax
' 各要求の開始時に呼び出されます。
Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)
Dim topPath As String = "/Default.aspx"
If Request.FilePath <> topPath Then
' アクセス先がDefault.aspx(先頭ページ)でない場合
Dim urlReferrer As Uri = Request.UrlReferrer
If urlReferrer Is Nothing Then
' リンク元のページが空(直接アクセス)の場合、強制的にDefault.aspxにリダイレクト
Response.Redirect(topPath)
Else
' 自分のルートURLを取得
Dim requestUri As Uri = New Uri(Request.Url, Request.ApplicationPath)
If Not urlReferrer.AbsoluteUri.StartsWith(requestUri.ToString()) Then
' 他のホストからアクセスした場合、強制的にDefault.aspxにリダイレクト
Response.Redirect(topPath)
End If
End If
End If
End Sub
ポイント
(1) ユーザーが直接にサイトへアクセスしてきたかどうかを確認するには、HttpRequest.UrlRefererプロパティ(カレント・ページへのリンク元のURLを返す)を利用する。
(2) 以下の場合、アプリケーションが想定していたリンクとは異なるものと見なして、強制的に先頭ページ(今回の場合ではDefault.aspx)へリダイレクトする
+ UrlRefererプロパティが空文字列(当該ページに直接にアクセスしてきた)場合
+ 現在のアプリケーション・パスとは異なるURLを返した(偽造されたダミーのページからリンクされた)場合
→ユーザーによる途中ページへの直接アクセスを防ぐことができる。
注意点
* UrlRefererプロパティは、クライアントがリクエスト時にセットしてきたリクエストヘッダの内容を取得しているにすぎず、クライアント側で作為的にリクエストヘッダを偽造していたら、防ぐ手段はない。
→もしもリクエスト・ヘッダを改ざんするようなケースを防ぐには、セッション情報にアプリケーションの状態を管理するためのフラグを持たせるなどの施策が必要
* UrlRefererプロパティ関連の改ざんの記事は、以下の通り。
http://bakera.jp/ebi/2003/5/8