プロが教える店舗&オフィスのセキュリティ対策術

戻るボタンで、ログイン中を維持させない。

お世話になっております。
perlで、ログイン(ID、パスワード)するページを作り、
データ入力が終わるとログアウトさせる画面を作っているのですが、
ログアウト(コマンドボタンをクリックしトップページに戻る)したあと、
ブラウザの「戻る」ボタンで戻ると、また、ログイン中になります。
これを、他のサイトでもよく見る「ページの有効期限切れ」にしたいのです。

この種の解決方法は、検索するといろいろ出ていたのですが、
主に、jspで、
response.setHeader("Pragma","no-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires",0);
などで、「httpヘッダやmetaタグでクライアントにキャッシュをさせない」ようにする方法が
一般的なようですが、jspはよくわからなかったので、
perl(.cgi)だけで実現する方法はないのでしょうか。

ソースは、簡単に書くと以下の通りです。(データ入力部は省略)

↓login.cgi------------------------------
 :
<form name="frm1" action="logout.cgi" method="post">
ID:<INPUT name="usrid" TYPE="text">
パスワード:<INPUT name="pwd" TYPE="password">
</form>
 :
↑login.cgi------------------------------

↓logout.cgi------------------------------
 :
<form name="frm1" action="top_page.cgi" method="post">
<input type="button" onClick="submit();" value="ログアウト">
</form>
 :
↑logout.cgi------------------------------

行き詰っております。
どなたかご助言賜れませんでしょうか。
よろしくお願いします。

A 回答 (4件)

>個人を識別させたいのですが、意味がないのですか。



質問文を読んだ限りでは、個人認証処理に関する記載、及び、それの有効無効の判断に関する判定処理とかあたりが読み取れなかったので、単純にそう書かせていただきました。

認証、及び、それの有効無効判別の処理あたりを補足願います。
と書いておけばよかったですかね。



>>cookieの書き込みはできたのですが、cookieのクリアがされません。

クッキーのクリアに関しては、
・有効期限を過去にして書き込む(→勝手に消えてくれる。
・同じクッキーに対して、「空白」なりなんなりを上書きする。(→ユーザー認証をする上で有効でないクッキーデータにしてしまう。

のが分かりやすいと思いますよ。
両方とも「書き込み」で対処できる内容ですので。
    • good
    • 0

#2追記


データベースを使わないセッション管理方法としてはCookieでセッション管理をする方法もあります

[ログイン]でユーザ情報・有効期限が書かれているCookieの書き込み
[管理画面]Cookieの情報を読み込んでユーザ・パスワードがただしいか確認
[ログアウト]有効期限切れのCookieをだしてCookieの破棄

とほほのCookie入門
http://www.tohoho-web.com/wwwcook.htm

この回答への補足

>Cookieでセッション管理をする方法
で挑戦しているのですが、
やはり、戻るボタンで戻ると、Cookieの内容が残っていて、
ログイン中になってしまいます。
なんか基本的なところが間違っているような気がします。

以下がテストをしたそのソースです。
・test01.cgiをログイン、
・test02.cgiをデータ入力部、
・test03.cgiをログアウト
と見立ててテストしました。

↓test01.cgi---
#!c:/Perl/bin/perl
#↓Cookieへの書き込み
print "Content-type: text/html\n";
print "Set-Cookie: ";
print "name=1;";
print "expires=Friday, 31-Dec-2100 00:00:00 GMT;\n";
print "\n";
#↑Cookieへの書き込み
print <<EOM;
<html>
<head>

<title>test1</title>
</head>
<body>
<form method="POST" action="test02.cgi">
<p><input type="submit" value="送信" name="submit"></p>
</form>
</body>
</html>
EOM


↓test02.cgi---
#!c:/Perl/bin/perl
print "Content-type: text/html\n\n";
#↓Cookieの読み込み
&getCookie();
$name = $COOKIE{'name'};
if($name eq ""){ # nameがnullならexit;
print "<BR>stop!";
exit;
}
sub getCookie {
local($xx, $name, $value);
foreach $xx (split(/; */, $ENV{'HTTP_COOKIE'})) {
($name, $value) = split(/=/, $xx);
$value =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg;
$COOKIE{$name} = $value;
}
}
#↑Cookieの読み込み
print <<EOM;
<html>
<head>

<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">
<title>test2</title>
</head>
<body>
<form method="POST" action="test03.cgi">
<p><input type="submit" value="送信" name="submit"></p>
</form>
</body>
</html>
EOM


↓test03.cgi---
#!c:/Perl/bin/perl
#↓Cookieへの書き込み
print "Content-type: text/html\n";
print "Set-Cookie: ";
print "name=; ";
print "expires=Friday, 31-Dec-1900 00:00:00 GMT;\n";
print "\n";
#↑Cookieへの書き込み
print <<EOM;
<html>
<head>

<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">
<title>test3</title>
</head>
<body>
</body>
</html>
EOM

補足日時:2010/09/10 09:58
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

ご助言の通り、
>Cookieでセッション管理をする方法
でトライしているのですが、
どうもうまくいきません。

まず、
今回の小生のソースプログラム(login.cgi、logout.cgi、top_page.cgi)で言うと、
login.cgiでユーザID、パスワード入力後、
サブミットでlogout.cgiに飛ぶため、
logout.cgi内でユーザ、パスワード判定を行っております。
また、データ入力も、logout.cgi内です。

従いまして、
>[ログイン]でユーザ情報・有効期限が書かれているCookieの書き込み
は、サブミット後のlogout.cgi内で処理し、
>[ログアウト]有効期限切れのCookieをだしてCookieの破棄
は、これもサブミット後のtop_page.cgi内で処理するということで、よろしいでしょうか。

これで試してみたのですが、
cookieの書き込みはできたのですが、cookieのクリアがされません。
top_page.cgiから、[戻る]ボタンでlogout.cgiを開くと、
cookieの内容が残っています。

試しに、logout.cgiの先頭のほうに、
&clearCookie();
&getCookie();
を入れて、中身を表示させると、中身が表示されてしまいました。
何か間違っているのでしょうか。


それとも、login.cgi画面でユーザID、パスワード入力後、
サブミットでlogout.cgiに飛ぶ前に、
Cookieの書き込みをするのでしょうか。そうでしたら、その方法がわかりません。


いずれにしても、引き続き調査中です。
まずは、経過報告を兼ね、御礼申し上げます。

お礼日時:2010/09/08 16:11

完全にブロックできるわけではありませんがヘッダに


Pragma: no-cache
Cache-Control: no-cache
Expires: Thu, 01 Dec 1994 16:00:00 GMT
を追加する
参考URL
とほほのwww入門
http://www.tohoho-web.com/wwwxx008.htm

ログイン・ログアウトをセッション管理する
参考URL
http://d.hatena.ne.jp/jitsu102/20091108/1257680513
    • good
    • 0

こんちくは。


ん???


「ログインさせる意味」ってあるんですか??

・ログイン画面で、IDPASS入力

・DB参照なり何なりで、OKだったら「ログイン認証OKフラグをたてる」

・ログイン後のページで、「ログイン認証OKフラグ」が立ってたらシステムが使える。
・立ってなきゃ、「ダメ」だから強制遷移なりなんなり。

・ログアウト処理時に「ログイン認証OKフラグ」を消してやる。

・どうやって戻ったとしても、ログイン後ページで「ログイン認証OKフラグがたってなければ使えない」というプログラムにしておけば、問題なし。

んな感じじゃないかと。

少なくとも、「ログイン認証がされたっす」って判別だけは持っておかないと、ログイン後のページのURL直接叩けば誰でもログインせずに利用できることになっちゃいますよ?


>>これを、他のサイトでもよく見る「ページの有効期限切れ」にしたいのです。

これは、ページを表示するに必要な情報を格納しといたものが、消えたためにただ表示できないだけ。
かと思いますよ。多分。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

>「ログインさせる意味」ってあるんですか??
個人を識別させたいのですが、意味がないのですか。

お礼日時:2010/09/08 11:02

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!