リンク制限(SetEnvIf, Referer)
クライアントからのリクエストのヘッダーには「Referer」と言う情報が含まれている場合があります。これはリンク元のURLに関する情報が含まれています。
リンク元の情報を使うことで、適切なリンクを経由せずに直接アクセスがあった場合にアクセス制限をかけることが可能になります。
まず「SetEnvIf」を使って環境変数の設定を行います。今回は「Referer」をチェックして条件に合う場合に設定する環境変数を定義します。
SetEnvIf Referer リンク元情報 設定する環境変数
ヘッダーに含まれる「Referer」を確認して正しいリンク元情報と比較します。正しい場合には環境変数を設定します。具体的な例で見てみましょう。
SetEnvIf Referer "http://test.officepro.jp" check
この場合、対象のファイルに対するアクセスのリファラーをチェックして「http://test.officepro.jp」からのリンクでアクセスがあったかどうかをチェックします。もしその通りであれば環境変数に「check」と言う名前の環境変数を設定します。(checkと言うのは例です。任意の環境変数を設定できます)。
そして「Allow」の対象に環境変数が設定されているかどうかを記述します。
Allow from env=check
上記ではIPアドレスなどの情報の代わりに、環境変数「check」が設定されていれば許可するという設定になります。
実際にテスト
では実際に試してみましょう。今回は「img」ディレクトリに含まれるファイルに対して「http://test.officepro.jp」から始まるファイルからのリンク経由で要求があった場合だけアクセスを許可する設定にしてみます。
まず次のようなHTMLファイルを1つ用意しドキュメントルートに配置します。
<html> <body> <h1>Referer Check</h1> <img src="./img/referer.png" border="0"> </body> </html>
次にドキュメントルートに「img」ディレクトリを設置し、その中に「referer.png」と言う画像ファイルを置いておきます。
特に設定を行っていない場合は、「http://test.officepro.jp/referertest.html」と入力した場合も「http://test.officepro.jp/img/referer.png」と画像ファイルを直接URLに指定した場合も表示されます。
では直接のリンクを制限するために「httpd.conf」のファイルの最後に次の記述を追加します。
<Directory "D:/Apache Group/Apache2.2/htdocs/img"> SetEnvIf Referer "^http://test.officepro.jp" check Order deny,allow Deny from all Allow from env=check </Directory>
ドキュメントルートの下にある「img」と言うディレクトリに対してアクセス制限をかけています。リファラーをチェックしてリファラーの先頭から「http://test.officepro.jp」となっている場合だけアクセスを許可します。
「http://test.officepro.jp/referertest.html」と入力した場合、このHTMLファイルの中から「img」ディレクトリ内にあるファイルが呼ばれています。この場合、画像ファイルのリファラーは「http://test.officepro.jp/referertest.html」となりますのでアクセスが許可されます。
これに対して「http://test.officepro.jp/img/referer.png」と入力した場合、直接URLを入力するとリファラーが設定されないためアクセス制限で許可が行われません。その為ブラウザで見ることが出来なくなります。
このようにリファラーを使ってアクセス制限をかけることで、ある程度のリンク制限をかけることが出来ます。ある程度と言うにはリファラーをそもそも送って来ないブラウザもありますし、セキュリティソフトによってはリファラーを消すものがあります。このようなクライアントからはアクセスが出来なくなります。またリファラーを偽造できるものもありますので、リファラーによるアクセス制限は絶対とは言えません。
ちなみにセキュリティソフト対応としてリファラーが無い場合にもアクセスを許可するには次のように記述します。
<Directory "D:/Apache Group/Apache2.2/htdocs/img"> SetEnvIf Referer "^http://test.officepro.jp" check SetEnvIf Referer "^$" check Order deny,allow Deny from all Allow from env=check </Directory>
このようにしてしまうと直接URLを入力した場合にも許可されてしまいますが、他のサーバにあるHTMLファイルの中で直接画像にだけリンクを貼って表示させるような制限を行うことは出来ます。
( Written by Tatsuo Ikura )