Apacheで画像への直リンクを禁止する

Apache で公開しているコンテンツの中にある画像ファイルは、まったく別の Web サイト内で公開しているページ内から参照し、そのページ内で画像として表示させることができます。このような方法で他のサイトの画像を表示させる方法を一般的に画像の直リンクといった言い方をします。ここでは Apache で公開している画像ファイルに対して外部からの直リンクを禁止する設定方法について解説します。

(Last modified: )

画像の直リンクとは

Web サーバで公開している Web ページには画像が含まれていることがありますが、 Web ページの中で画像を表示する場合には <img> タグが次のように Web ページに記述されています。

<img src="画像ファイルのURL">

画像ファイルの URL は同じサーバであれば "images/ball.png" にように <img> タグを記述した html ファイルからの相対パスで指定することもできますし、画像の URI である http://aaa/image/ball.png のような形で指定することもできます。

http://aaa/park.html

<html>
<body>
<img src="images/ball.png">
<img src="http://aaa/image/ball.png">
</body>
</html>

そして、画像の URI を指定して <img> タグを記述する方法の場合、まったく別の Web サイトで公開されている画像であっても自分の Web ページで表示することができます。例えば A というサイトで使われている画像を B というサイトにある html ファイルの中で読み込んで表示することができます。

下記では bbb というサイトの中で公開している Web ページの中で、全く関係ない aaa というサイトで使われている画像を読み込んで表示しています。

http://bbb/maome/tokyo.html

<html>
<body>
<img src="http://aaa/image/ball.png">
</body>
</html>

このような別のサイトで公開されている画像を自分のサイトの Web ページから読み込んで表示するときに、相手側の許可を取ったり特別な手続きを行う必要はありません。公開されている画像であればどのサイトの画像でも自由に読み込むことができます。このように外部で公開されている画像の URI を取得し、 <img> タグで読み込んで表示することを画像の直リンクといいます(単に画像へリンクを貼ることも直リンクと呼ぶこともあります)。

直リンクは画像を許可なく使われるといった問題のほかに、自分が公開しっている画像を外部の Web ページから直リンクされると、外部の Web ページが閲覧されるたびに自分が利用している Web サーバへも画像取得のリクエストが来て自分の Web サーバの負荷も増えるという問題があります。その為、画像の直リンクを禁止しているサイトもあります。

それでは実際に試してみます。次のサイトでは画像が 1 つ含まれている Web ページを公開しています。

画像の直リンクとは(1)

このサイトで使われている画像の URI を取得します。通常ブラウザ上で画像の上で右クリックをすることで、画像の URI を簡単に取得することができます。

画像の直リンクとは(2)

このサイトで使われている画像の URI を取得し、ローカルで動かしている Apache で公開しているページの中で読み込んでみます。すると他のサイトで公開している画像を自分のサイトの Web ページの中で読み込んで表示することができました。

画像の直リンクとは(3)

画像の直リンクというものがどういったものかお分かり頂けましたでしょうか。それでは Apache で画像の直リンクを禁止する設定を行う方法について解説します。

Apacheで画像の直リンクを禁止する

画像の直リンクを禁止する方法として、画像に対するリクエストのリファラーをチェックし、リファラーが自分のサイトだった場合には画像へのアクセスを許可するけれど、そうでなかった場合はアクセスを拒否します。リファラーとは参照元のことです。自分のサイトの Web ページの中から画像が読み込まれている場合はリファラーは自分のサイトとなります。

Apache でリクエストのリファラーをチェックするには SetEnvIf ディレクティブを使用します。 SetEnvIf ディレクティブではリファラーをチェックし、別途指定した正規表現とマッチする場合に環境変数に対して値を設定できます。今回は次のように記述しました。

SetEnvIf Referer "www\.buzzword\.jp" imagecheck

画像へのリクエストのリファラーに www.buzzword.jp が含まれていたら環境変数 imagecheck が定義されます(値が省略されているので 1 が設定されます)。

※ SetEnvIf ディレクティブの使い方については「SetEnvIfディレクティブ:リクエストに含まれる情報に基づいて環境変数を設定する」を参照されてください。

次に Require env ディレクティブを使って指定した環境変数が定義されていればアクセスを許可します。

SetEnvIf Referer "www\.buzzword\.jp" imagecheck
Require env imagecheck

※ Require env ディレクティブの使い方については「指定の環境変数が定義されていれば許可する(Require env)」を参照されてください。

httpd.conf にて設定する場合は Directory ディレクティブで対象となるディレクトリを指定したり、 Files ディレクティブで対象となるファイルの拡張子などを指定し、ブロック内で先ほどの設定を記述します。

<Directory d:/pg/Apache/Apache24/htdocs/images>
  SetEnvIf Referer "www\.buzzword\.jp" imagecheck
  Require env imagecheck
</Directory>

.htaccess ファイルを使って設定する場合は .htaccess ファイルに次の設定を記述し、.htaccess ファイルを画像の直リンクを制限したいディレクトリに設置してください。

SetEnvIf Referer "www\.buzzword\.jp" imagecheck
Require env imagecheck

これで画像の直リンクを禁止する設定は完了です。( httpd.conf ファイルを編集した場合は Apache を再起動しておいてください)。

それでは実際に試してみます。画像を公開している元のサイトでは問題なく画像が表示されます。

Apacheで画像の直リンクを禁止する(1)

画像を直リンクしていた Web ページを表示してみると、画像を読み込むことができず画像が表示されなくなりました。

Apacheで画像の直リンクを禁止する(2)

今回は自分のサイト以外がリファラーに設定されている画像へのリクエストはすべてアクセスを拒否しましたが、リファラーが特定のサイトの場合だけ画像へのリクエストを拒否するような設定も可能です。

-- --

Apache で公開している画像ファイルに対して外部からの直リンクを禁止する設定方法について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。