うろぐ

インターネットサービス&デジタル家電&デジタルカメラ&パソコンのレビュー

会員制のサイトの作成中の話です
個人的な趣味のサイトで仕事では無いのですが、セキュリティなどは商用のサイトに負けないようにしています。
会員制とは情報の投稿を会員に限定していることです。投稿された情報は一般のユーザーも閲覧が出来ます。
ただし、会員が投稿した情報や写真の公開範囲を自由に設定できるようにしています。例えば、インターネットに公開する、会員にのみ公開する、友人にのみ公開する、個人での閲覧のみ、と4つの設定から選べます。

ここで問題となるのが画像の表示です。
Forbidden文章などのデータはデータベースで管理しているので、閲覧できる範囲をCGIを使用して簡単に設定できるのですが、画像へ直にURLでたどられると画像のみが表示されてしまいます。
例えば
http://www.example.com/picture/photo/xxxx.jpg
というURLからのアクセスがあった場合には、画像を表示させないようにします。


Mt_tomurausiユーザーがリンクをたどってきた場合にはこのように画像が表示されます。


これを防ぐ手だては無いかと調べてみました。
この記事は、この防ぐ手だてを調べる過程とその結果の報告で、わたし自身の備忘録を兼ねています。


先ず考えたこと
1.ディレクトリに認証をかけることを探しましたが、有りませんでした。
2.次に、画像ディレクトリをルートディレクトリと同列に配置してみましたが、サーバが画像を詠み込むことが出来ませんでした。(/www/htmlがルートディレクトリとして/www/pictureというディレクトリを作成して/pictureの中に画像をアップロードすれば外部からは参照できません。ただしサーバも参照できないので無理でした)
3.サーバ側で認証をかける手だてを探そうとApacheの書籍の購入を考えましたが、わたしの欲している情報が掲載されているか読んでみなければ分からないこと、読んだ結果掲載さえていなければ無駄な投資と時間を費やすことになることから諦めました。

ネットで情報を探す
こうした情報をネットで探すのは、現在のネットにあるサイトの多さから見て不可能です。手がかりとなるスクリプトなどがないとたどり着けません。
そこで思いついたのが質問をして回答を得られるサイトです。yahooやgoo、はてななどが提供しているので利用をしてみることにしました。
利用しようとすると、確実にこちらの求める回答が得られるサイトでないと時間の無駄となります。どれがよいか、「Apache」をキーワードに各サイトにつき5ページほど、全部の質問と回答を見てみましたが、yahooは程度が低くて使いものになりません。gooは当たりはずれが多そうで、最良の結果が得られるか無駄に終わるか半々とみました。「はてな」は有料だけあってか、かなり専門的な質問がなされてもしっかりとした回答がほぼ全てにつけられていたので、「はてな」に質問をする事にしました。もっとも実際に質問しようとしたら、ポイントを購入くださいと表示されるまで、有料とは知りませんでした。

「はてな」に質問
「はてな」に質問をしようと文章を考えると、以外と難しいことに気づきました。他のサイトからの直リンクと混同されない兼ねないからです。
例えば
http://www.example.com/picture/photo/xxxx.jpg
の画像に対して
< img class="imgli" src="http://www.test.com/picture/photo/xxxx.jpg " />
とリンクを張っても画像は表示されるからです。
質問を書いては訂正を繰り返すこと1時間、何とか質問の真意が伝わると自信の文章ができあがったので投稿をしました。
驚いたことに、15分ほどで回答がありました。

回答を頼りにぐぐる
折角得られた回答でしたが、そのままではエラーがでてつかえませんでした。でもキーワード検索のきっかけがつかめたので後は楽です。
検索中に.htaccessが有効かどうかを調べる、というサイトを見つけたので、試したところなんと無効となっていました。これまでサーバ会社とのやりとりで、サーバ会社からの回答によく「設定は.htaccessにoooooooと記入して配置してください」とあったので、当然有効となっていると思っていました。
久しぶりにhttpd.configファイルをテキストエディタで開き修正をしてApacheを再起動、.htaccessが有効となっていることを確認しました。
httpd.configファイルの変更点

オリジナル
<Directory />
    Options FollowSymLinks
    AllowOverride None
</Directory>

変更後
<Directory />
    Options All
    AllowOverride All
</Directory>

.htaccessが無効になっているからだめだったのだろうと、ここで最初に得られた回答を再び試してみましたがだめです。
また検索を再開しました。

サーバ会社から回答が到着する
丁度このころ、サーバ会社に「はてな」と同じ質問をしていた回答がきました。
この回答もそのままではエラーとなりましたが、「はてな」の回答とは若干の違いがあり、検索の絞り込みに役立ちました。

微妙に違う記述
こちらの望むスクリプトが書かれたページを幾つか見つけることが出来ました。
でも微妙に記述が違うのです。その違いを丁寧に説明してくれているページも有れば、スクリプトだけが記述されているページもあるので、一つ一つのスクリプトを実際に.htaccesに記述してサーバにアップロードして動作を確認しました。結果、動作に変化はなく、記述の違いが与える影響は分かりませんでした。
これで、こちらの望む.htaccessがほぼできあがりました。

新たな問題の発生・ノートン利用者対策
ノートンなどを使用しているユーザーの一部にはrefererを返さないことがわかりました。
今回作った.htaccessはrefererを利用しているので、refererがないと画像は表示されません。アクセス解析の結果、no refererは数%いることが分かりましたので、出来れば表示させたいと思い、さらなる検索が続きます。
SetEnvIf Referer "^$" ref
と追加すると、no refererでも表示させることが出来ることが分かりました。この1行はno refererでも表示させるという意味なのですが、これはわたしの望むhttp://www.example.com/picture/photo/xxxx.jpg を無効にする事には役に立ちませんでした。
ここで、数%のno refererユーザーに対しては、新しい方法が見つかるまで諦めることにしました。

.htaccessのデメリットを認識
殆どのサイトでは.htaccessのメリットを述べていたのですが、こんかいぐぐって見たところ、デメリットも有ることが分かりました。わたしの利用しているサーバ会社はこの点もあるので無効としていたのかもしれません。
1つはユーザーがアクセスする都度にサーバが.htaccessを読み込んで処理を実行するので、サーバの負担が重くなること。
2つはセキュリティホールが発生すること。
セキュリティホールの対策の一つとして.htaccessをユーザに詠み込ませない様に設定することをしてみました。
<Files ".*">
deny from all
</Files>

を書き込んだのですが、
http://www.example.com/picture/.htaccess とアクセスした場合、上記を記述してもしなくても当方の使用しているサーバでは非表示となっているので、この記述はしないことにしました。

また問題が発生
完成を見た.htaccessですが、また問題が発生しました。
わたしは2つのホスティングサービスを利用していますが、その一方でテストをしていて望む効果が得られたのですが、もう一方のホスティングサービスでは望む効果が得られませんでした。

さて、何が問題かまた探さなければなりません。
2つのホスティングサービスはわざとサーバのバージョンを変えてあります。OKのサーバはApache1.3.x、NGのサーバはApache2.0.xを利用しているので、バージョンによる違いかと思い調べてみましたが、検索結果にバージョンによる違いがあるというページはヒットしませんでした。さてどうしようと思った時に、.htaccessファイルを配置する場所をhttp://www.example.com/picture/.htaccess ではなく実際に画像が入っているhttp://www.example.com/picture/photo/.htaccess に変えてみました。これが正解です。通常、,htacessファイルは配置したディレクトリと下位のディレクトリ全体に影響を与えるのですが、このサーバはセキュリティ対策のためか、.htaccessを配置したディレクトリにのみ影響を与えるように設定されていました。
これで、すべて完了しました。

完成した.htaccessファイル
SetEnvIf Referer "^http://example\.com/cgi-bin/" ref
Order Deny,Allow
Deny from all
Allow from env=ref

これで全て希望通りの動作をしてくれます。

googleの意外な弱点
googleの検索結果の表示順位が、作成された古いサイト、ページど上位に表示されることはよく知られていますが、今回のように最新のサーバの情報を得ようとすると、この表示順位の方法がとても使いづらくなります。表示される順位の上位のかなりの割合が1999とか2002とかに作成されたページでした。Apache1.3.xなら役に立つ場合もありますが、2.0.xでは役に立ちません。
googleは最近、パーソナルドサーチに力を入れているようですが、少なくとも一般検索をする場合には、必要とする検索結果は帰って来づらくなってきています。
これだけサイトが増えると、googleで検索をしてももう望む結果が簡単に得られることはないのかもしれません。検索エンジンはgoogle、yahooともに新しい方向性を打ち出していますが、ひょっとするとそれはもう間違えた道で、全く新しいサービスが必要とされているのかもしれません。

2月 8th, 2008

Posted In: Web & Technology/ウェブと技術

タグ: , , , , , ,

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です