.htaccess活用法(3)

.htaccess(拡張子がhtaccessということで、ドットが必要です。ファイル名がないので最初戸惑いますが、こういうものだと思ってください。)が利用可能だと、

3.参照元(Referer)によるアクセス制限が可能

例えば、イラストを公開する人たちの中には、直リンクに困っている人もおられるかもしれません。苦労して書いたイラストを他人のサイトで引用され、しかも、帯域(データ転送に必要なサーバへの負荷)も勝手に使われるのが、画像などへの直リンクです。当然、道徳的にも問題なのですが、これらを止めさせる方法は無いでしょうか?

もちろん、相手側に抗議するのも有効ですが、無視されるかもしれません。こういう場合、事を荒立てずに対処する方法として、リンク元(Referer)を参照します。 通常、HTMLファイルに画像ファイルへのパスが、<img src="hoge.jpg" width=100 height=80>などとあった場合、hoge.jpgのRefererは、そのHTMLファイルになります。これを利用します。


 【広告】 amazon.co.jp「ネットワーク関連ベストセラー・ランキング」

この正規のHTMLファイル以外のURLがRefererになっているならば、OKですが、第3者のサーバがRefererになっていれば、アクセスを拒否します。したがって、画像が表示されません。不法行為を働くものを止めさせるのが無理であれば、直リンクしても無駄なようにします。画像が表示されなければ、相手もHTMLを書き換え、直リンクを止めるかもしれません。(直リンクをやめ、画像を第三者のサーバにアップされ、リンクされたらどうなるかという問題もありますが、その場合は、そもそも画像を盗まれないように、いわゆる"右クリック禁止"処理が必要になります。右クリック禁止については、私が以前まとめた「HTMLソースを隠す方法:右クリックを禁止する(カスタマイズメニューの表示)を参照してください。」)

.htaccessをFTPでアップしたはずなのに見えない?!
.htaccssや.htpasswdなど「.(ドット)」で始まるファイルは、デフォルトのままでは見えません。これはセキュリティ的な理由です。

telnetが使えるならば、「ls」コマンドにオプションを付けて、「ls -la」で「.(ドット)」で始まるファイルも一覧表示することが可能で、.htaccessや.htpasswdも確認できるでしょう。

また、FTPソフトでも、例えば、NextFTPならファイルリストを取得するためのコマンドを設定できるため、便利です。.htaccessや.htpasswdなど「.(ドット)」で始まるファイルもファイルリストに表示させることが可能です。

話が少し逸れましたが、直リンクを防ぐには、Refererをどのように取得するかが問題になってきます。CGI(perl)やPHPファイルならば、プログラム中で環境変数を取得することは簡単です。でも、画像ファイルに対してはどのようにRefererを取得するかといいますと、このホームページのテーマである.htaccessで可能なのです。

    SetEnvIf Referer "^http://www\.shtml\.jp" ref_ok
    order deny,allow
    deny from all
    allow from env=ref_ok
などと書きます。一行目の「SetEnvIf」から解説します。「Env」とはEnvironment(= 環境)の略であり、環境変数のことを指します。環境変数には、ユーザーエージェントやReferer、ホストアドレスなどが含まれています。「If」とは「もし〜なら」ですから、「もし、環境変数Refererが"http.//www.shtml.jp"で始まっているならば」、という意味になります。そして、何を「Set」するかと言えば、「ref_ok」という変数です。

そして、前章の「ホストアドレスによるアクセス制限」の項目で見ましたように、最初に全部deny(拒否)した後に、一部だけを許可するのですが、ここで、「env=ref_ok」とあります。環境変数からref_okがsetされていたらという許可するという意味になります。

ここで、注意してもらいたいのは、一行目で、例えば、「SetEnvIf Referer "www.shtml.jp" ref_ok」などと書いてしまうと、とにかくRefererに「.shtml.jp」が含まれていればOKになってしまうのですから、不法行為を行うものは、RefererとなるURLを変えて、ディレクトリー名に「www.shtml.jp」を含む形で作成するかもしれないということです。不用意に短くしすぎると「穴」ができます。

また、冒頭で、「通常は」と書きましたように、悪意がないユーザーが正規にあなたのサイトを訪問しているにもかかわらず、画像ファイルのRefererはそれを掲載しているHTMLファイルのURLであるとは限らない事例があります。アクセスログを見たことのある人なら、必ず一度や二度は、どうしてこのようなRefererが残るのであろうといぶかしく思うようなケースはなかったでしょうか? 例えば、自分のページAからあるページBにリンクしているにかかわらず、なぜかBがAの参照元になっているケース。Aがこちらのリンクに気がつき、お礼に逆リンクしてくれたのかと思って調べてみても、一向に見つからないというようなこと。

また、ユーザーがNorton Internet SecurityやNorton Personal Firewall を利用している場合、デフォルトではRefererを送信しないように設定されるため、Refererのチェックを行っている場合、そのユーザーがアクセスしたとき、画像などが一切表示されない現象が起こります。悪意がないにもかかわらずです。

●(参照)Symentec: 参照元(リファラ)情報が遮断されてホームページが表示されない場合の対処方法
http://service1.symantec.com/SUPPORT/INTER/nisjapanesekb.nsf/jp_docid/20021020160209947

にあるとおりです。

このように、Refererのチェックは善意の第三者があなたのサイトを楽しむのを妨害することになるかもしれません。このことは予め考慮すべきです。

また、それ以上に知っておくべきなのは、Refererは偽装が可能だということです。そこまでして直リンクする意味はないと思いますが、理論的には可能です。とは言っても、Refererをチェックし、別途「Norton Internet Securityをご利用のユーザー様へ」とアナウンスを出しているサイトも増えてきました。Refererによるアクセス制限で、善意の第三者を混乱させないような仕組みを作るのであれば、Refererチェックがセキュリティ上有効であり、強力であることは否定できません。

Refererチェックは直リンク防止以外にも、例えば、想定しているサイト外からのCGIの起動を防止する上でも、よく使います。例えば、フォームを使ったメール送信プログラムが第三者によって利用されると問題ですので、このような場合、Refererチェックが有効になってきます。また、Refererチェックは、連続投稿ソフトなどを使った掲示板の「荒らし」行為にも、"いくぶん"有効な場合があります。


--広告--
【PR】 英文法・英会話関連の書籍

【PR】 アトピーのかゆみに安眠パジャマ

【PR】 バイオリスニングなど英語教材比較

話がRefererの問題全般に広がってしまいましたが、サーバサイドプログラムによってRefererをチェックできないHTMLファイルや画像ファイルに対するRefererでアクセス制限を行うのであれば、.htaccessを利用する必要があり、方法は冒頭で説明したような「SetEnvIf」を使った方法になります、ということになります。なお、「SetEnvIfNoCase」の場合は、大文字小文字を関係なくチェックしてくれます。詳しくは、下記で紹介していますApacheの公式マニュアルを参照してください。


   ※「ディレクティブ」とは「命令」の意味。

▼ Allowディレクティブ、Denyディレクティブ、Orderディレクティブ
http://httpd.apache.org/docs-2.0/ja/mod/mod_access.html

▼ SetEnvIfディレクティブ
http://httpd.apache.org/docs/mod/mod_setenvif.html#setenvif



次のページでは、「.htaccessを利用した特定のユーザーエージェント(ブラウザ・ロボット)からのアクセス制限」を考えます。ダウンロード支援ソフトを使った大量ダウンロードなどを拒否したり、お行儀の悪い検索エンジン用ロボットを拒否するために使います。