2011年6月28日火曜日

cookie検証

[root@tanyao0b cgi-bin]# cat login.cgi
#!/usr/bin/perl

#フォームからの受け取りをデコードする
&dec;

#クッキーの読み出し
&splt;

#入室用のパスワード
$passw = '0123';

#入力されたパスが正しければ
if ($forminh{'pass'} eq $passw) { &site_form; }

#cookieのパスが正しければ
elsif ($COOKIE{'ckpas'} eq $passw) { &site_cookie; }

# 初期アクセス
print <<"HTML";
Content-type: text/html








統合監視システムへようこそ!
パスワード:
HTML exit; #入力されたパスが正しければ表示するサイトのサブルーチン sub site_form { #クッキーの書き出し print <<"HTML"; Content-type: text/html Set-Cookie: ckpas=$forminh{'pass'}; expires=Tue, 1-Jan-2030 00:00:00 GMT; path=/cgi-bin/; HTML print <<"HTML"; Content-type: text/html site_form 統合監視システムへログイン成功!!
Get from COOKIE: $ENV{'HTTP_COOKIE'}
Get from FORM: $forminh{'pass'}

下記リンクをクリックするとこのページをリロードします。
login.cgi
HTML exit; } #cookieのパスが正しければ表示するサイトのサブルーチン sub site_cookie { print <<"HTML"; Content-type: text/html site_cookie こちらは、統合監視システムです。すでに認証済みです。
Get from COOKIE: $ENV{'HTTP_COOKIE'}
Get from FORM: $forminh{'pass'}

ログアウトはこちら
HTML exit; } #フォームからの値をデコードするサブルーチン sub dec { #フォームからデータを受け取り変数へ入れる read(STDIN, $formin, $ENV{'CONTENT_LENGTH'}); # + 記号を半角スペースに戻す $formin =~ tr/+/ /; #URLエンコードデータをデコード $formin =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; @indata = split (/&/,$formin); #受け取ったデータを&で区切り、配列へ foreach $tmp (@indata) #フォームの要素分(配列分)以下の処理を繰り返す { ($name,$value) = split (/=/,$tmp); # =記号で区切り、名前 と 値 に分ける $forminh{$name} = $value; #区切った名前を付けた連想配列に値を入れる } } #クッキー読み出し用のサブルーチン sub splt { @cookdata = split(/;/,$ENV{'HTTP_COOKIE'}); #クッキーを配列に foreach $tmp (@cookdata) #クッキーデータの有る間処理をする { ($youso,$atai) = split(/=/,$tmp); #要素名と値に区切る $youso =~ s/ //; #要素間のスペース除去 $COOKIE{$youso} = $atai; #要素名の連想配列に値を入れる } } [root@tanyao0b cgi-bin]# cat logout.cgi #!/usr/bin/perl #クッキーの読み出し &splt; #入室用のパスワード $passw = '0123'; #cookieのパスが正しければ if ($COOKIE{'ckpas'} eq $passw) { &site_cookie; } # 初期アクセス print <<"HTML"; Content-type: text/html 認証に失敗している可能性があります。

認証画面はこちら
HTML exit; #cookieのパスが正しければ表示するサイトのサブルーチン sub site_cookie { #クッキーの書き出し print <<"HTML"; Content-type: text/html Set-Cookie: ckpas= ; expires=Tue, 1-Jan-2020 00:00:00 GMT; path=/cgi-bin/; HTML print <<"HTML"; Content-type: text/html site_cookie ログアウトしました。

Get from COOKIE: $ENV{'HTTP_COOKIE'}
Get from FORM: $forminh{'pass'}
Delete Password from Cookie !!

ログイン画面はlogin.cgi
HTML exit; } #クッキー読み出し用のサブルーチン sub splt { @cookdata = split(/;/,$ENV{'HTTP_COOKIE'}); #クッキーを配列に foreach $tmp (@cookdata) #クッキーデータの有る間処理をする { ($youso,$atai) = split(/=/,$tmp); #要素名と値に区切る $youso =~ s/ //; #要素間のスペース除去 $COOKIE{$youso} = $atai; #要素名の連想配列に値を入れる } }

0 件のコメント:

コメントを投稿