.htaccessについて質問です。今現在会員サイトを構築しているのです。アクセス制限はBasic認証ではなくクッキーとセッションIDを組み合わせたものを使用していますがカバーできるディレクトリではCGIなどのWebアプリが作動してくれないのでWWW上のディレクトリに置くことにしました。


しかしこの場合、会員のみ使用できるサービスがブラウザからもみれるディレクトリに置くためURLさえ分かれば誰でも観覧できてしまう点です。そこをカバーする方法としてhtaccessを使用し全てをdenyしリファーラをチェックし http://hoge.ccc/hogehoge/hoge.html からのアクセスの許可する方法は可能でしょうか? この場合、http://hoge.ccc/hogehoge/hoge2.htmlではブロックされなければなりません。

また、この場合Webセキュリティ面では大丈夫なのでしょうか?悪意を持ったユーザによってリファーラを変換しhttp://hoge.ccc/hogehoge/hoge.htmlを通したかのように見せかけブロックしてあるページを観覧することは実際に可能なのでしょうか?

よろしくお願いいたします。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2005/11/03 15:36:04
  • 終了:--

回答(4件)

id:andi No.1

andi回答回数448ベストアンサー獲得回数02005/11/03 16:06:59

ポイント10pt

http://www.shtml.jp/htaccess/referer.html

.htaccessで参照元(Referer)によるアクセス制限する方法

.htaccessを用いてリファラチェックを行うことは可能です。


> 悪意を持ったユーザによって~実際に可能なのでしょうか?


リファラはクライアント側の情報なのでリファラを変換可能なブラウザorツールなどを使えば可能です。

id:esecua

なるほど。変換可能なブラウザで通り過ぎられてしまいますか。ほかに有力な方法はないでしょうか?

2005/11/03 16:14:39
id:andi No.2

andi回答回数448ベストアンサー獲得回数02005/11/03 16:40:16

ポイント10pt

http://search.cpan.org/

The CPAN Search Site - search.cpan.org

解決方法はあることはありますが、多少面倒です。


現在、アクセス制限が出来ないコンテンツはHTMLなどの静的コンテンツのことだと思いますが(動的コンテンツであればセションチェックが可能なので)、まずこれらのファイルはWWWからアクセス不可能or外部からは分かりにくい置き場所におきます。

次に下記の仕様のCGIを作成します。


1.セションチェックを行う

2.クエリ文字列でリソース名(本当に欲しいファイル名を示す文字列)を受け、そのファイルを読み込み、画面に表示する

3.画面に表示する前にそのファイル内に存在するURL(src=””やhref=””等で検索)を自分自身(このCGI)を示しかつクエリ文字列に元のURLを追加する

※例:http://abc/def.htmlhttp://abc/session_check.cgi?url=def.html


さらに3は面倒で、元のURLに元々他にクエリ文字列が入っている場合と入っていない場合に分けて考える必要があります(元のURLに先に「?」が入っているかどうか)。


またCGIの言語がPerlでしたらCPANを探せばURLの書き換えを行ってくれるモジュールがありそうな気がしましたが、今はダウンしているようで繋がりませんでした(URI、override辺りで探せばありそう)。

id:esecua

なるほど。しかしどのようのそのようなシステムを作り上げるのかが問題ですね。。回答ありがとうございました。

2005/11/03 19:50:36
id:ito-yu No.3

ito-yu回答回数323ベストアンサー獲得回数142005/11/06 00:35:53

ポイント20pt

http://httpd.apache.org/docs/2.0/ja/mod/mod_actions.html

mod_actions - Apache HTTP ������

htmlに対してアクセス制限をかけるのであれば、リファラーチェックよりも、mod_actionsのActionディレクティブでの制御が有効ではないでしょうか。


Action text/html /cgi-bin/access.cgi


で、htmlファイルへのアクセス時に/cgi-bin/access.cgiが起動しますので、ここでクッキーのチェックなどが可能です。PATH_INFOをみることでリクエストされたhtmlファイル名を判別できます。

id:esecua

なるほど。access.cgiを通してHTMLファイルを読み込ませるのですね。

ところで、このaccesss.cgiスクリプトとはどこでてに入るのでしょうか?

2005/11/06 08:27:53
id:ito-yu No.4

ito-yu回答回数323ベストアンサー獲得回数142005/11/06 23:08:40

ポイント30pt

「アクセス制限はBasic認証ではなくクッキーとセッションIDを組み合わせたものを使用していますが」とあるので、認証済みのクッキーを判別するコードは書ける前提でお話を進めます。私はPerlよりもPHPが好みなのでPHPで例を書きますが、Perlでも同様のコードを書けると思います。

access.php:

<?php

$doc_root = ’/path/to/document/root’; // ドキュメントルートの絶対パス

if($_COOKIE[’auth’]){ // 認証OKの条件を入れてください

$file_path = $doc_root.$_SERVER[’PATH_INFO’];

echo file_get_contents($file_path);

}else{

die(’401 Unauthorized’);

}

?>


アクセス制限をつけたいディレクトリに置く.htaccess:

Action text/html /path/to/access.php


※access.phpへのドキュメントルートからの絶対パスに適宜変えてください


これで、*.html にアクセスしようとするとaccess.phpが呼び出され、認証条件OKならばファイルの内容を表示、さもなければエラーを吐くようにできます。当然、認証されたユーザと、閲覧してよいファイル名のチェックを追加しなければならないでしょうが。

id:esecua

回答ありがとうございました。これだけ書いていただくと高ポイントを差し上げなければなりませんね。

2005/11/09 12:11:17

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません