CGIの開発言語にもよると思いますが。。。
通常は、クッキー(cookie)を使用するのではないでしょうか。
アクセス一回毎に認証をするつもりがないなら、セッション管理の利用をお勧めします。
JSPやPHPをお使いならば、標準機能の中にセッション管理機能があります。
PerlやC言語など、他の環境をお使いの場合でも、上記のクッキーを応用する事でセッション管理は可能です。
余計なお世話を承知で言えば、セッション管理が不要で、コンテンツ(ページ)単位の認証のみでよいなら、Webサーバー(あるいはOS)標準の認証機構を用いた方が、よりセキュアな認証を行う事ができると思います。(SSLとか使用して・・・)
説明を読む限りではファイルの読み書きが出来ればOKっぽいけど、違うのかな?
入力されたIDを元に
「入力されたID.prf」ファイルを開く
ファイルが存在しなかったらエラー処理
開けて中身と入力されたパスワードを比較
違ってたらエラー処理
この2点が突破できたもの=正しい入力
って処理でいいと思う。
違ったらスマソ
これでいいのでしょうか?
ID.prfの中にパスワードの他にメールアドレス等が入っています。
#### 定数値設定 #####
$SCRIPT_NAME = $ENV{’SCRIPT_NAME’};
$SCRIPT_NAME =~ s/.*¥///;
$MEMBER_PATH = ”./members/”;#id.prfが入っているフォルダです。
##### ユーザ名・パスワードチェック #####
# POSTされたデータを取得(アカウント情報部分)
$id = $POST{’id’};
$input_passwd = $POST{’pw’};
if (open FH, $MEMBER_PATH.”$id.prf”) {
$pw = split(/¥x01/, <FH>);
$pw = $tmp[2]
close FH;
if ($input_passwd ne $pw) {
# パスワードが違ったのでエラー表示
# 終了
die ”パスワードが違います。”;
}
} else {
die ”ユーザIDが違います”;
}
宜しくお願いいたします。
このCGIが、パスワードをファイルに保存してパスワード管理をしているようですので、ソースを見れば参考になると思います。
>パスワード、ID、メールアドレスなどを保存する「psw.txt」を
kazu064064さんの回答とmiller31さんがコメントで述べられているように,
基本的にはファイルとの比較でよいと思います.
しかし,なんらかの方法でパスワードが漏れてしまったときのことを考え,
URLで示したcrypt関数を用いて暗号化するのがよいと思われます.
具体的には,ファイルの中に暗号化したパスワードをいれます.
認証の際に,ユーザが入力したパスワードを暗号化してファイルの中身と比較します.
cryptは不可逆暗号なので,ファイルに書かれたパスワードが漏れても,
不正にアクセスできなくなります.
とりあえず、文法的なところで、
誤: $SCRIPT_NAME =~ s/.*¥///; # /が一つ足りない
正: $SCRIPT_NAME =~ s{.*/}();
誤: if (open FH, $MEMBER_PATH.$id.prf”) { # $id.prf が未定義
正: $id.prf = ”ID.prf”;
if (open FH, $MEMBER_PATH.$id.prf”) {
誤: $pw = $tmp[2] # ;がない
正: $pw = $tmp[2];
くらいでしょうか。。
下記のような感じでは?
(¥ ’ ” は、半角に直してくださいね)
#!/usr/local/bin/perl -w
print ’Content-Type: text/plain’;
print ”¥n¥n”;
#### 定数値設定 #####
$SCRIPT_NAME = $ENV{’SCRIPT_NAME’};
$SCRIPT_NAME =~ s{^(.*/)¥w*(¥.¥w*)*$}{$1};
$MEMBER_PATH = ”./members/”;#id.prfが入っているフォルダです。
##### ユーザ名・パスワードチェック #####
# POSTされたデータを取得(アカウント情報部分)
$id = $POST{’id’};
$input_passwd = $POST{’pw’};
if (open FH, $MEMBER_PATH . ”id.prf”) {
$pw = split(/¥x01/, <FH>);
$pw = $tmp[2];
close FH;
if ($input_passwd ne $pw) {
# パスワードが違ったのでエラー表示
# 終了
die ”パスワードが違います。”;
} else {
print ”SUCCEED!¥n”; #正常処理
}
} else {
die ”ユーザIDが違います”;
}
http://www.harukaze.net/~mishima/perl/faq/perl-cgi-faq5j.html
Perl CGI Programming FAQ 5j
そのPerlソースではダメでしょう。
「; rm -rf / ;」というIDがきたらどーすんの?
ま、あなたがサーバのどのレベルまで管理できるかで、答えは変わってきます。
#-----------------------------------------------------------------------------
# 定数値設定
#-----------------------------------------------------------------------------
$SCRIPT_NAME = $ENV{’SCRIPT_NAME’};
$SCRIPT_NAME =~ s/.*¥///;
$MEMBER_PATH = ”./members/”;
# ログイン画面表示用エラーメッセージ連想配列
%login_err_msg = {
1 => ’ユーザー名が入力されていません。’,
2 => ’ユーザー名が間違っています。’,
3 => ’パスワードが間違っています。’,
};
#-----------------------------------------------------------------------------
# MAIN
#-----------------------------------------------------------------------------
# クエリー文字列を取得する(GET/POSTされたデータ)
$q = new CGI;
$action = $q->param(’ACT’);
$id = $q->param(’id’);
$pw = $q->param(’pw’);
# Content-Typeをあらかじめ出力しておく
print ”Content-type: text/html; charset=Shift_JIS¥n¥n”;
# ACT別に処理を分岐させる
#なし → ログイン画面表示
#’login’ → ログイン処理後、掲示板を表示
#’post’ → 掲示板投稿処理
#’delete’ → 投稿削除処理
# ACTが何も指定されない場合(CGIを直接起動した場合)、ログイン画面を出す
unless ($action) {
&html_login();
exit();
}
# ユーザ・パスワードチェックを行う
# - この行に来ている時点で、$actionには何か値が入っている。
$login_err = &check_member();
if ($login_err) {# ユーザ名・パスワードに何か問題がある場合
if ($action eq ’login’) {
# ログインしようとしていた場合は、再度ログイン画面を出してあげる
&html_login($login_err_msg{$login_err});# エラーメッセージを表示させつつ、ログイン画面を出す
} else {
# ログイン処理以外(投稿・削除)は、エラーメッセージを出すだけ???
print $login_err_msg{$login_err};
}
exit();
}
# 掲示板処理を行う
#- この行に来ている時点で、ユーザ名・パスワードは正しい。
&bbs();
exit();
#-----------------------------------------------------------------------------
# ユーティリティ関数
#-----------------------------------------------------------------------------
# ユーザ名・パスワードが正しいかチェック
#戻り値:
#0 → 正当なユーザ(ユーザ名、パスワードが正しい)
#1 → ユーザ名が未入力
#2 → 存在しないユーザ名
#3 → パスワードが違う
#備考:
#グローバル変数$id、$pdを参照する。
#$idを入力されたユーザー名、$pdを入力されたパスワードとして解釈し、戻り値を返す。
sub check_member
{
# ユーザ名について検証する
if ($id eq ’’) { return 1; }# $idが空
open FH, ”$MEMBER_PATH.$id.prf” or return 2;# $id.prfが存在しない
# プロフィールファイルからパスワード文字列を取得する
@tmp = split(/¥x01/, <FH>);
$valid_pw = $tmp[2];
close FH;
# パスワードについて検証する
if ($pw ne $valid_pw) { return 3; }# パスワードが違う
return 0;# 正当なユーザ
}
細かい事は、とりあえず脇に置いときます。
このやり方だと、ログインページを一度通り抜けられると、その後パスワードチェックの機会が有りません。
たとえば、BBSのURLをブックマークしておけば、退会後のメンバーでもBBSにアクセス可能ですし、(検索エンジンや他の掲示板を通じて) URLが晒されれば、アクセス制御できません。
ログイン認証を通ったブラウザにクッキーを送るなどして、クッキーがないか不正な場合はログインページに誘導するロジックも必要だと思います。
(この例ですと、掲示板を表示、掲示板投稿処理、投稿削除処理の冒頭でしょうか)
ここから下、「脇」の一部です。ご参考まで。
・funcion内の変数は my にした方が良い。
・idが日本語とかだったら$id.prfは もう一工夫要ると思います。
・・$idをjcodeあたりで変換して、更に、ファイルセパレータとかをエスケープする。
・・念のため${id}.prfにしておく。
・・ファイルが存在するかどうか-s -rでチェックする。
などなど
すいません 開発言語はPerlでした。