4.パスワード表


■概要  会員専用のページをはじめセキュリティのあるページをつくるには、ID とパスワードの対応表は欠かせ ません。しかし、この ID とパスワードの対応表の作成と管理(参照、追加、変更)は以外と大変なので、 ここでは Perl プログラムによる簡単な管理作成方法を紹介しておきます。100 人、200 人程度の規模で あればこれで十分間に合うはずです。  まず、次のような1年1組と1年2組の10人ずつのパスワード表をつくってみます。パスワードは 簡単のために連番形式としましたが、乱数を発生させてつくることもできます。これは後で、各自が変更 することを仮定しているので、とりあえずこのようなものをつくってみます。
生徒番号パスワード
20031101
20031102
  ・
  ・
  ・
20031110

20031201
20031202
  ・
  ・
  ・
20031210
abc1101
abc1102
 ・
 ・
 ・
abc1110

bcd1201
bcd1202
 ・
 ・
 ・
bcd1210
 カンマ(,) 区切りでこのパスワード表をつくるには次の Perl プログラムを実行します。
# pass.pl

open F, ">id-pass.txt";

$a = 20031100, $b = "abc1100";
for (1..10)
  {++$a, ++$b; print F "$a,$b,"}

$a = 20031200, $b = "bcd1200";
for (1..10)
  {++$a, ++$b; print F "$a,$b,"}
 これを実行すると、次のようなテキストファイルが作成されます。 id-pass.txt
20031101,abc1101,20031102,abc1102,20031103,abc1103,20031104,abc1104,20031105,abc1105,20031106,abc1106,
20031107,abc1107,20031108,abc1108,20031109,abc1109,20031110,abc1110,20031201,bcd1201,20031202,bcd1202,
20031203,bcd1203,20031204,bcd1204,20031205,bcd1205,20031206,bcd1206,20031207,bcd1207,20031208,bcd1208,
20031209,bcd1209,20031210,bcd1210,
 CGI ファイルでこのパスワード表をハッシュ %id として読み込むには、次のようにデータを配列化して 読み込むだけです。   open F, "id-pass.txt";   %id = split /,/, <F>;  この結果、たとえば $id{20031105} は 'abc1105' という値を持つことになります。これを次の Perl プログラムで 確かめてみます。
open F, "id-pass.txt";
%id = split /,/, <F>;
print $id{20031105};
<結果>; abc1105  パスワードの追加及び変更は次の Perl プログラムで行うことができます。CGI 上でも可能ですが、安全のために 自分のパソコン上でデータの追加・変更を行い、サーバー上に転送(上書き)します。 * このプログラムは最終行に DOS 画面の終了待機命令 <>; を設けていますので、ダブルクリックによっ て DOS 窓を閉じることなく実行することができます。DOS 窓のクローズは Enter key など任意の key を 押してください。また、Copal を利用する場合は、「DOS 窓へ出力」で実行してください。
# henko.pl

print "\n 番号:";
$num = <>;
chomp $num;

open F, "id-pass.txt";
$_ = <F>;
/$num,(.+?),/;

if ($1 eq '') 
  {print "\n 登録なし。新規登録(y,n):";
   $a = <>;
   chomp $a;
   if ($a eq 'y')
     {print "\n パスワード:";
      $pass = <>;
      chomp $pass;
      open A, ">>id-pass.txt";
      print A "$num,$pass,";
      print "\n $num,$pass を追加しました。"
     }
  }

else
  {print "\n 現在のパスワード $1\n 変更(y,n):";
   $a = <>;
   chomp $a;
   if ($a eq 'y')
     {print "\n パスワード:";
      $pass = <>;
      chomp $pass;
      s/$num,(.+?),/$num,$pass,/;
      open A, ">id-pass.txt";
      print A $_;
      print "\n $num,$pass に変更しました。"
     }
  }
<>;