#!/usr/local/bin/perl # enter.cgi # # CGIでパスワード制限 v1.0 is Free. (c)rescue.ne.jp # # |-bin # |-dev # |-etc # |-<b>private_html</b>(新規に作成する)サーバによっては新規作成権限がない場合があります # | | # | |-- 401.html(認証されなかった場合に表示する) # | |-- 404.html(認証されたがファイルがない場合に表示する) # | |-- ここに認証後に表示させるファイルを置く # | |-- いくつでも設置できる # | |-- ここに置いたファイル名はパスワード入力画面HTMLの<option>で指定する # | # |-public_html # | | # | |--private(任意のディレクトリ) # | |-- enter.cgi(このスクリプト) # | |-- index.html(パスワード入力フォーム) # |-usr # # enter.cgiから見たprivate_htmlディレクトリの位置指定 # 上記の構成ならばこのままでよい $private_html = '../../private_html'; # IDとそれに対応したパスワードを設定する(書き替えてください) # かならず0からの一連番号を付けること(いくつでも増やせます) # このenter.cgiを他のユーザから見られてしまうようなサーバでは、 # このenter.cgiのパーミッションを705にするなどして対応してください。 # メッシュでは755でOKです。 #--------------------------------------------------------------------- $ID[0] = 'rescue'; $PW[0] = 'test'; $ID[1] = 'taro'; $PW[1] = 'paopao'; $ID[2] = 'jiro'; $PW[2] = 'wahaha'; $ID[3] = 'rescue@ask.or.jp'; $PW[3] = 'justy'; $ID[4] = 'sabu'; $PW[4] = 'boygirl'; #--------------------------------------------------------------------- if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $FORM{$name} = $value; } $members = @ID; foreach (0 .. $members -1) { if ($FORM{'password'} eq $PW[$_] && $FORM{'id'} eq $ID[$_]) { $target = $FORM{'target'}; &html; } } $target = '401.html'; &html; sub html { if (!open(HTML,"$private_html\/$target")) { &html404; } @lines = <HTML>; close(HTML); print 'Content-type: text/html' ."\n\n"; foreach (@lines) { print; } exit; } sub html404 { # 上記 sub html で404.htmlを扱うことができますが、万が一404.htmlが開けない場合、 # 無限ループを起こしてしまうので、このルーチンを別に付けました。このルーチンには # エラー処理をしていませんので、404.htmlが開けない場合はサーバエラーになります。 open(HTML,"$private_html\/404.html"); @lines = <HTML>; close(HTML); print 'Content-type: text/html' ."\n\n"; foreach (@lines) { print; } exit; }