▼ [Apache] 画像への直接リンクを防ぐ
画像等を外部から直接参照させる形で利用されることを防止する方法。Apache 1.3 + mod_rewrite を利用する。
自サイトが http://www.example.com/ で、それ以外からの直接リンクを避けるには httpd.conf に以下の設定を行う。この設定では、代替画像として http://www.example.jp/tmp/eroero.gif へリダイレクト ("R"; redirect) される。また、"NC" (no case) が指定されているため、大文字と小文字を区別しない。
RewriteEngine on
RewriteLog /var/log/httpd/rewrite.log
RewriteLogLevel 9
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://www\.example\.jp/ [NC]
RewriteCond %{REQUEST_URI} !^/tmp/eroero\.gif$
RewriteRule \.(jpg|png|gif)$ http://www.example.jp/tmp/eroero.gif [R,NC]
HTTPで通常アクセスされない領域に代替画像を置き、リダイレクトを行うことなくその画像そのものを返す方法もある。(RewriteCondの記載は省略しているが必要。)
RewriteRule \.(jpg|png|gif)$ /www/tmp/eroero.gif [NC]
また、特定のサイト (http://www.example.com/, http://www.example.net/) からを排除するのみで事足りる場合には、HTTP_REFERER に関する条件を下記のように設定する。なお、いずれかに該当すればよいため、"OR" (logical or) の指定を行っている。
RewriteCond %{HTTP_REFERER} ^http://www\.example\.com/ [OR,NC]
RewriteCond %{HTTP_REFERER} ^http://www\.example\.net/ [NC]
問題点
この方法で制限を行った場合、img による指定や、背景画像として利用されることは防止できるが、通常のリンク (a; アンカータグ) によって参照する場合にも代替画像にリダイレクト (または置換) されてしまう。これを避ける方法は無い。
また、不正に参照しているサイトへのアクセス後、正規のサイト (http://www.example.jp/) へアクセスした場合、正規のサイトから参照されているにも関わらず、(ブラウザのキャッシュにより) 代替画像が表示される可能性がある。このような事象を避けるには、"Expires: 過去の日付", "Pragma: no-cache", "Cache-Control: no-cache" などを出力することで対応できる。これは、send-as-is ハンドラやCGIプログラムを利用することで出力することが出来る。以下、send-as-is ハンドラを利用する場合の設定について記載する。
- Apacheのhttpd.confに以下の指定をする。(RewriteCondの記載は省略しているが必要。)
AddHandler send-as-is asis ... RewriteRule \.(jpg|png|gif)$ /www/tmp/eroero.gif.asis [NC,L]
- ヘッダ付きの画像を作成する。
% cd /www/tmp % (cat; cat eroero.gif) > eroero.gif.asis Status: 200 OK Content-Type: image/gif Expires: Thu, 01 Jan 1970 00:00:00 GMT Pragma: no-cache Cache-Control: no-cache ← 空行 ^D ← CTRL+D
- Apacheを再起動する。
# /usr/local/etc/rc.d/apache.sh restart
- TB-URL(確認後に公開) http://diary.asuka.net/018/tb/
-
▼
画像への直接リンクを防ぐ (補足)
Magical Diary, beta version 画像への直接リンクを防ぐ (2007/07/23)の補足。RFC 2616で Referer: は以下の通り定義されており、絶対URIの他、相対URIを含めることも許されている。Referer = "Referer" ":&q...
