Apache | アクセス権限 | リンク制限(SetEnvIf, Referer)

リンク制限(SetEnvIf, Referer)

クライアントのリクエストヘッダーには、Refererという情報が含まれている場合がある。これは、どこからリンクされたかを示すURL情報である。

URLを直接入力してアクセスし、Referer情報が含まれていない場合には、アクセス制限をかけることができる。

まずSetEnvIfを使用して環境変数を設定する。今回はRefererを確認し、条件を満たす場合に設定する環境変数を定義する。

SetEnvIf Referer リンク元情報 設定する環境変数

ヘッダーに含まれるRefererを確認し、正しくリンクされているかを比較する。正しい場合は環境変数を設定する。具体例は次のとおりである。

SetEnvIf Referer "http://localhost" local_referal

この場合、対象ファイルへのアクセスRefererを確認し、http://localhostからリンクでアクセスされたかどうかを確認する。一致する場合は環境変数を設定する。環境変数名は任意に設定できる。

そしてRequireで環境変数が設定されているかを確認する。

Require env check

上記では、IPアドレスなどの情報ではなく、環境変数checkが設定されていれば許可する設定になる。

実習

では実際に使ってみる。まず、imgディレクトリに含まれるファイルについて、http://localhostで始まるファイルからリンク経由で要求があった場合だけアクセスを許可するように設定する。

まず次のHTMLファイルをドキュメントルートに作成する。

referer.html

<html>
<body>
<h1>Referer Test</h1>
<img src="./img/devkuma.png">
</body>
</html>

そしてドキュメントルートにimgディレクトリを作成し、その中にdevkuma.pngというファイル名で任意の画像ファイルを置く。

何も設定していない場合、http://localhost/referer.htmlを入力した場合も、http://localhost/img/referer.pngのように画像ファイルのURLを直接入力した場合も、問題なく表示される。

直接リンクを制限するため、httpd.confファイルの末尾付近に次の内容を追加する。

SetEnvIf Referer "^http://localhost" local_referal
<Directory "${SRVROOT}/htdocs/img">
    Require all denied
    Require env local_referal
</Directory>

ドキュメントルート配下のimgディレクトリに対するアクセス制限を行っている。Refererを確認し、Refererの先頭がhttp://localhostの場合だけアクセスを許可する。

http://localhost/referer.htmlを入力すると、HTMLファイル内でimgディレクトリにある画像ファイルが要求される。この場合、画像ファイルのRefererはhttp://localhost/referer.htmlになるため、アクセスが許可される。

一方、http://localhost/img/devkuma.jpgを直接URL入力するとRefererが設定されないため、アクセスは許可されず表示されない。

これでRefererを使用して、ある程度のリンク制限をかけられるようになった。ただし、Refererをもともと送信しないブラウザや、セキュリティソフトによってRefererが無効にされる場合もある。このような場合、クライアントからアクセスできなくなる。また、Refererは偽装できるため、Refererによるアクセス制限は絶対的なものではない。

なお、セキュリティソフトへの対応としてRefererがない場合もアクセスを許可したい場合は、次のように記述する。

SetEnvIf Referer "^http://localhost" local_referal
SetEnvIf Referer "^$" local_referal
<Directory "${SRVROOT}/htdocs/img">
    Require all denied
    Require env local_referal
</Directory>

このように記述すると、URLを直接入力した場合も許可されるが、別サーバー上のHTMLファイルから画像だけへ直接リンクして表示することは制限できる。

参照