Browsing the archives for the html category

アクセスの制限

GDライブラリをいじくったサムネイル作成は透過GIF,PNG対応とか考えるともう少し時間がかかるので明日にします・w・
今日は.htaccessを用いた直リンクの制限について。

会員制のサイトとかで使われてる画像って、外部からアドレスを直打ちしても403 Forbiddenってなるケースがありますよね。

あんな感じで外部からのアクセスを制限する方法について述べます。

htmlファイルに関してはphpつかってログインページかなんかでセッション変数を発行して、その変数を保持していなければログインページへheader(‘Location:path’)でとばしてあげればいいです。

問題は画像とかテキストファイルとかです。

こういったものは基本的に .htaccess というApacheの設定ファイルでなんとかしちゃいます。

<Files ~ "\.jpg$">
SetEnvIf Referer "^http://www\.hikingoo\.net" CHECK
order deny,allow
deny from all
allow from env=CHECK
</Files>

今回はjpgファイルを例にとって説明します。

まず1行目で対象となるfileを正規表現でjpgにしぼります。

2行目で環境変数の設定です、リファラーがサーバーアドレスだったら場合はCHECKを設定します。
その他ならスルーです。

3行目のorder は禁止と許可の順序を決めてます。 denyが禁止、allowが許可なので禁止→許可の順に設定されます。

4行目ですべてのアクセスを禁止します。

5行目で環境変数がCHECKのものだけを許可します。

これによってサーバー内でのリンクでその画像を表示することができても外部からのアクセスは拒否されるようになりました。

例をあげましょう。

まず最初に

http://www.hikingoo.net/test/2010-01-05/img/nyanxhiko.jpg

このアドレスをブラウザにぶちこんで画像を表示してみてください。

403とでて正しく画像が表示されなかったはずです。
(見れちゃった人は先にこの記事下部の結果を見てしまったんだと思います。 キャッシュを見てるだけなので削除してみてください)

次に同一サーバー内のhtmlファイルからのimgタグによる表示です。
ソースはこんな感じ

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp" />
<title>にゃんひこ</title>
</head>

<body>

<img src="img/nyanxhiko.jpg">
</body>
</html>

結果はこちら

どうでしょう。

みごとなラリアットですね。

同じ画像ファイルにアクセスしてるのに同一サーバー内からのリンクを辿るか辿らないかでアクセスを禁止できます。

これを利用してアクセスを禁止された状態でそのままログインページをリダイレクトするとかしてSNSにありがちなシステム構築ができそうです。

No Comments
1月 5, 2010 in apache, html