#!/usr/local/bin/perl ;# パスワード・リダイレクタ Password Redirector v1.0 ;# ;# Script written by Kazu.Y ;# Created on: 04/Oct/97 ;# I can be reached at: resq@rescue.ne.jp ;# Scripts Found at: http://www.rescue.ne.jp/ ;# Usage redirect.cgi?action=<読み出すファイル名>&type=<コンテントタイプ> ;# <コンテントタイプ>を省略すると text/html となる. ;# redirect.cgi を直接実行すると、保存されたクッキーに空データを上書きする. ;# 履歴(History) ;# v1.00 20/Jun/98 公開版リリース #----------------# # 初期設定 # #----------------#---------------------------------------------------------------------- #認証後に表示するファイルを置くディレクトリ(ベースディレクトリ) $base_dir = "./member/"; #パスワードファイル $pwdfile = './password.cgi'; #設定 # 注意! の********の部分だけを設定します. $body = 'bgcolor=#ffffff'; #クッキーの有効期間 1:セッション内 0:最終実行後30日間有効 $session = 1; #--------------------------------------------------------------------------------------- #データ入力 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; } if ($FORM{'USERNAME'} =~ /\W/ || $FORM{'PASSWORD'} =~ /\W/) { &error("エラー","USERNAMEやPASSWORDに半角英数字以外が使われている場合は利用できません."); } if (substr($FORM{'action'},-1,1) eq '/') { $FORM{'action'} .= "index.html"; } #※ #クッキー取得 $cookie_path = $ENV{'SCRIPT_NAME'}; $cookies = $ENV{'HTTP_COOKIE'}; @pairs = split(/;/,$cookies); foreach $pair (@pairs) { ($name,$value) = split(/=/,$pair); $name =~ s/ //g; $DUMMY{$name} = $value; } @pairs = split(/,/,$DUMMY{$cookie_path}); foreach $pair (@pairs) { ($name,$value) = split(/:/,$pair); $COOKIE{$name} = $value; } #分岐 if ($FORM{'action'} eq '') { &cookie; $cook="USERNAME\:\,PASSWORD\:"; print "Set-Cookie: $cookie_path=$cook; path=$cookie_path; expires=$date_gmt\n"; &error("リセットOK",""); } elsif ($COOKIE{'USERNAME'} ne '' && $COOKIE{'PASSWORD'} ne '') { $FORM{'USERNAME'} = $COOKIE{'USERNAME'}; $FORM{'PASSWORD'} = $COOKIE{'PASSWORD'}; &passwd; &action; } elsif ($FORM{'USERNAME'} ne '' && $FORM{'PASSWORD'} ne '') { &passwd; &action; } &input_form; sub input_form { print "Content-type: text/html\n\n"; print <<"EOF";

認証

$errmsg

USERNAME
PASSWORD

ネットスケープまたはインターネットエクスプローラで
クッキーを有効にしてご利用ください.

EOF exit; } sub action { if ($FORM{'type'} eq '') { $FORM{'type'} = "text/html"; } if (!open(READ,"$base_dir$FORM{'action'}")) { &error("エラー","$FORM{'action'}を読み出せません."); } print "Content-type: $FORM{'type'}\n\n"; while () { print; } close(READ); exit; } sub cookie { if (!$session) { ($secg,$ming,$hourg,$mdayg,$mong,$yearg,$wdayg,$ydayg,$isdstg) = gmtime(time + 30*24*60*60); $y0="Sunday"; $y1="Monday"; $y2="Tuesday"; $y3="Wednesday"; $y4="Thursday"; $y5="Friday"; $y6="Saturday"; @youbi = ($y0,$y1,$y2,$y3,$y4,$y5,$y6); $m0="Jan"; $m1="Feb"; $m2="Mar"; $m3="Apr"; $m4="May"; $m5="Jun"; $m6="Jul"; $m7="Aug"; $m8="Sep"; $m9="Oct"; $m10="Nov"; $m11="Dec"; @monthg = ($m0,$m1,$m2,$m3,$m4,$m5,$m6,$m7,$m8,$m9,$m10,$m11); $date_gmt = sprintf("%s\, %02d\-%s\-%04d %02d:%02d:%02d GMT",$youbi[$wdayg],$mdayg,$monthg[$mong],$yearg +1900,$hourg,$ming,$secg); } else { $date_gmt = ''; } } sub passwd { if (!open(DB,"$pwdfile")) { &error("エラー","パスワードファイルを処理できません."); } @lines = ; close(DB); @DATA = grep(/^($FORM{'USERNAME'})\:(.*)/,@lines); $axs = @DATA; if ($axs == 0) { $errmsg = 'USERNAMEまたはPASSWORDが合いません.'; &input_form; } if ($axs > 1) { &error("認証エラー","USERNAMEが複数登録されているために正常に処理できません."); } ($id,$pwd) = split(/\:/,$DATA[0]); chop($pwd); if ($pwd =~ /^\$1\$/) { $salt = 3; } else { $salt = 0; } if (crypt($FORM{'PASSWORD'}, substr($pwd,$salt,2)) ne $pwd) { $errmsg = 'USERNAMEまたはPASSWORDが合いません.'; &input_form; } &cookie; $cook="USERNAME\:$FORM{'USERNAME'}\,PASSWORD\:$FORM{'PASSWORD'}"; print "Set-Cookie: $cookie_path=$cook; path=$cookie_path; expires=$date_gmt\n"; } sub error { print "Content-type: text/html\n\n"; print "\n"; print "

$_[0]

\n"; print "

$_[1]

\n"; print "\n"; exit; }