#!/usr/local/bin/perl # # 参照制限2 # by CGI-RESCUE http://www.rescue.ne.jp/ # # ・2004.3.27 リリース # # # [設置例] < >内はパーミッションの相当値 # # /cgi-bin/ # | # |--/abcdefg/ ... このフォルダ名は推測しづらい名前をつける(※1) # | | # | |- このフォルダに隠しファイルを置いていく(※2) # | # |- index.cgi <755> # # ・入り口になるページは、HTMLファイルを置く通常の好きな場所に置きます。その場所は設定1に設定することになります。 # CGIを設置する場所をHTMLを置く場所が同じ場所でも構いません。 # # ・以下、●印の部分を書き換えてください。その他の部分は、相応の知識を持っていじってください。(サポート外です) # # (※1) このフォルダがCGIプログラムしか実行できない専用の場所ならその必要はない。なぜならCGI以外のどんなファイルを置いても表示できないから。(例:@niftyホームページサービスなど) #   または、ホームページフォルダ以外の、Webではアクセスできない位置に置くことが最適。いずれもそれが出来ない場合は、推測し難いフォルダ名をつけて、定期的に変更すると良い。 # # (※2) サブページは〜を中身部分(〜の部分)だけ記述してください。その前後はこのページで設定します。 # サブページの1行目は、そのページのタイトル(ブラウザのバーに表示される題名)を記述し、実際の内容は2行目から書いてください。 ###### ● 設定1 このフォルダ内に設置したページからのアクセスを許可する。 $base_url = 'http://www.rescue.ne.jp/cgi/reflimit2/sample/homepage/'; ###### ● 設定2 サブページを構成するファイルを置いておくフォルダ名。最後は / で閉じるのを忘れずに! 意味不明な任意の名前をつけること。途中で変更したらこの設定も変更する。 $txt_dir = './abcdefg/'; ###### ☆コラム☆ 次の1行を有効にする(コメント#を外す)と、日本語が第1番目に優先順位に設定されていないブラウザ(通常その国の言語が優先1位になっている)は拒否されます。 # if ($ENV{'HTTP_ACCEPT_LANGUAGE'} !~ /^ja/) { &error("JAPANESE ONLY"); } ###### ☆コラム☆ 次の数行を有効にする(必要に応じた行のコメント#を外す)と、 $REMOTE_HOST = gethostbyaddr(pack('C4',split(/\./,$ENV{'REMOTE_ADDR'})),2) || $ENV{'REMOTE_ADDR'}; #if ($REMOTE_HOST =~ /^\d+\.\d+\.\d+\.\d+$/ || $REMOTE_HOST eq "") { &error("REFUSED - $REMOTE_HOST","あなたの接続IPアドレスは逆引き出来ないためアクセスを拒否します。"); } #if ($REMOTE_HOST =~ /(123\.456\.789\.)|(\.anyhost.net)$/) { &error("REFUSED - $REMOTE_HOST","あなたの接続は拒否されました。"); } # (拒否するホスト名またはIP)|(ホスト名またはIP)|(ホスト名またはIP)… のように|(またはの意味)で区切って複数設定可能。この例では、"123.456.789.*" または "*.anyhost.net" を持つ接続を拒否させています。 #if ($REMOTE_HOST eq "111.222.333.444") { &error("REFUSED - $REMOTE_HOST","あなたの接続は拒否されました。"); } # この例では、特定のIP "111.222.333.444" からの接続を拒否しています。この行をコピーして複数設定できます。この行は1設定1拒否です。 $ref = $ENV{'HTTP_REFERER'}; $ref =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; if ($ref !~ /^$base_url$/i) { &error("不正な手順を検知","このページへは指定のページからのみアクセスできます。"); } # 直接サブページにアクセスしたときに表示されるエラーメッセージ $QUERY = $ENV{'QUERY_STRING'}; $QUERY =~ s/\.\.//g; $QUERY =~ s/\///g; $QUERY =~ s/\s//g; if ($QUERY eq "" || !-e "$txt_dir$QUERY\.txt") { &error("PAGE NOT FOUND - $QUERY","アクセスしたページは存在していません。"); } &disp($QUERY); sub disp { local($file) = @_; if (!open(R,"$txt_dir$file\.txt")) { &error("$! - $QUERY"); } $title = ; print "Content-type: text/html\n\n"; print <<"EOF"; $title EOF # ● 以下、サブページの共通の冒頭部分を表示する設定をします。print <<'EOF'; の次の行から EOF の上の行までの間に記述します。 # 共通領域なので、例えばすぺての画面の背景色を一度に変更したりできることになります。 #------------------------------------------------------------------------------------------------------------------------- print <<'EOF'; 冒頭エリア


EOF #------------------------------------------------------------------------------------------------------------------------- while () { print $_; } # ● 以下、サブページの共通の下部を表示する設定をします。print <<'EOF'; の次の行から EOF の上の行までの間に記述します。 #------------------------------------------------------------------------------------------------------------------------- print <<'EOF';


署名エリア EOF #------------------------------------------------------------------------------------------------------------------------- print <<'EOF'; EOF close(R); } sub error { print "Content-type: text/html\n\n"; # 以下はエラー表示画面です。print <<"EOF"; の次の行から EOF の上の行までの間に記述します。 #------------------------------------------------------------------------------------------------------------------------- print <<"EOF";

$_[0]

$_[1] EOF exit; }