はじめまして、初めて質問する者です現在、CGIで会員制の掲示板を作っているのですが、IDとパスワードの受け渡しのところで躓いています。仕様は会員さん全員のIDとパスワードがフォルダの中にあり一人一人,ID.prfというファイルの中にパスワードが入っています。その、IDとパスワード使用します。参考になるサイトやどんな文章にすればいいのでしょうか?宜しくお願いいたします。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:--
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答8件)

id:sasada No.1

回答回数1482ベストアンサー獲得回数133

ポイント15pt

 CGIの開発言語にもよると思いますが。。。

 通常は、クッキー(cookie)を使用するのではないでしょうか。

 アクセス一回毎に認証をするつもりがないなら、セッション管理の利用をお勧めします。

 JSPやPHPをお使いならば、標準機能の中にセッション管理機能があります。

 PerlやC言語など、他の環境をお使いの場合でも、上記のクッキーを応用する事でセッション管理は可能です。

 余計なお世話を承知で言えば、セッション管理が不要で、コンテンツ(ページ)単位の認証のみでよいなら、Webサーバー(あるいはOS)標準の認証機構を用いた方が、よりセキュアな認証を行う事ができると思います。(SSLとか使用して・・・)

id:miller31

すいません 開発言語はPerlでした。

2003/07/03 10:39:40
id:kazu064064 No.2

回答回数44ベストアンサー獲得回数0

ポイント15pt

説明を読む限りではファイルの読み書きが出来ればOKっぽいけど、違うのかな?

入力されたIDを元に

「入力されたID.prf」ファイルを開く

ファイルが存在しなかったらエラー処理

開けて中身と入力されたパスワードを比較

違ってたらエラー処理

この2点が突破できたもの=正しい入力

って処理でいいと思う。

違ったらスマソ

id:miller31

これでいいのでしょうか?

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が違います”;

}

宜しくお願いいたします。

2003/07/03 11:34:29
id:COFFEEBREAK No.3

回答回数423ベストアンサー獲得回数0

ポイント15pt

このCGIが、パスワードをファイルに保存してパスワード管理をしているようですので、ソースを見れば参考になると思います。

>パスワード、ID、メールアドレスなどを保存する「psw.txt」を

id:TrickStar No.4

回答回数2ベストアンサー獲得回数0

ポイント15pt

kazu064064さんの回答とmiller31さんがコメントで述べられているように,

基本的にはファイルとの比較でよいと思います.

しかし,なんらかの方法でパスワードが漏れてしまったときのことを考え,

URLで示したcrypt関数を用いて暗号化するのがよいと思われます.

具体的には,ファイルの中に暗号化したパスワードをいれます.

認証の際に,ユーザが入力したパスワードを暗号化してファイルの中身と比較します.

cryptは不可逆暗号なので,ファイルに書かれたパスワードが漏れても,

不正にアクセスできなくなります.

id:sasada No.5

回答回数1482ベストアンサー獲得回数133

ポイント15pt

とりあえず、文法的なところで、

誤: $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];

くらいでしょうか。。

id:namwonS No.6

回答回数10ベストアンサー獲得回数0

ポイント15pt

下記のような感じでは?

(¥ ’ ” は、半角に直してくださいね)

#!/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が違います”;

}

id:tmurakami No.7

回答回数4ベストアンサー獲得回数0

ポイント15pt

そのPerlソースではダメでしょう。

「; rm -rf / ;」というIDがきたらどーすんの?

ま、あなたがサーバのどのレベルまで管理できるかで、答えは変わってきます。

id:miller31

#-----------------------------------------------------------------------------

# 定数値設定

#-----------------------------------------------------------------------------

$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;# 正当なユーザ

}

2003/07/07 16:11:34
id:namwonS No.8

回答回数10ベストアンサー獲得回数0

ポイント15pt

 細かい事は、とりあえず脇に置いときます。

 このやり方だと、ログインページを一度通り抜けられると、その後パスワードチェックの機会が有りません。

 たとえば、BBSのURLをブックマークしておけば、退会後のメンバーでもBBSにアクセス可能ですし、(検索エンジンや他の掲示板を通じて) URLが晒されれば、アクセス制御できません。

 ログイン認証を通ったブラウザにクッキーを送るなどして、クッキーがないか不正な場合はログインページに誘導するロジックも必要だと思います。

 (この例ですと、掲示板を表示、掲示板投稿処理、投稿削除処理の冒頭でしょうか)

ここから下、「脇」の一部です。ご参考まで。

・funcion内の変数は my にした方が良い。

・idが日本語とかだったら$id.prfは もう一工夫要ると思います。

  ・・$idをjcodeあたりで変換して、更に、ファイルセパレータとかをエスケープする。

  ・・念のため${id}.prfにしておく。

  ・・ファイルが存在するかどうか-s -rでチェックする。

などなど

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません