管理用パスワードの作り方

CGIテクニック集トップへ





概要

スクリプトを最初に起動した時に管理用パスワードの設定を有無を判別し、設定されていなければ設定します。管理用パスワードはその後の管理人設定や記事の編集削除時に利用できます。当サイトのほとんどのスクリプトで利用されています。

必用な処理

  1. 管理用パスワードファイル有無を判別
  2. パスワードファイルがあれば何もしない
  3. パスワードファイルが無ければ設定ページを表示
  4. 設定ページの入力内容からパスワードファイルを作成
  5. スクリプトを再起動

サンプルコード

 use CGI;
 
 my $q = CGI->new;
 my $adminpwd="adminpwd.dat";
 
 unless (-e "$adminpwd"){
     if ($q->param('mode') eq 'wradminpwd'){
        &wradminpwd;
     } else {
        &setadminpwd;
     }
 }
 
 sub setadminpwd {
  print "Content-Type: text/html\n\n";
  print "<form name=\"setpwd\" action=\"$script\" method=\"post\">\n";
  print "<center>管理者用パスワードを設定してください。<br>\n";
  print "<input type=input name=\"pwd\" size=20>\n";
  print "<input type=submit name=\"sub\" value=\"設定\">\n";
  print "<input type=hidden name=\"mode\" value=\"wradminpwd\">\n";
  print "</form>";
 }
 
 sub wradminpwd {
    if (open(FILE,"> $adminpwd")){
        print FILE &makecrypt($q->param('pwd'));
        close(FILE);
    } else {
        print "Content-Type: text/html\n\n";
        print 'パスワードファイル作成に失敗しました';
        exit;
    }
  
    print "Location: $script\n\n";
 }
 
 sub makecrypt {
    my $plain = shift;
    my $salt = join "", ('.', '/', 0..9, 'A'..'Z', 'a'..'z')[rand 64, rand 64];
    my $result = crypt($plain,$salt) or crypt($plain,'$1$'.$salt.'$');
    return $result;
 }

コードの解説

 use CGI;
 
 my $q = CGI->new;

PerlのPackage CGI.pmを呼び出しオブジェクト$qを作成。この部分は引数を取るCGIであれば大体必用です。

 my $adminpwd="adminpwd.dat";

パスワードファイル名の設定。後にパスワードファイル名は全て$adminpwdで参照されます。

 unless (-e "$adminpwd"){
     if ($q->param('mode') eq 'wradminpwd'){
        &wradminpwd;
     } else {
        &setadminpwd;
     }
 }

unlessブロックがメインの処理。ファイル$adminpwdがあればこのブロックは実行されません。無ければ、最初の実行でelse部分が実行されパスワード入力画面をサブルーチンsetadminpwdを実行することで表示します。$adminpwdが無く、且つスクリプトの実行がパスワード入力後であればif ($q->param('mode') eq 'wradminpwd')部分を実行しサブルーチンwradminpwdによりパスワードファイル$adminpwdを作成します。

 sub setadminpwd {
  print "Content-Type: text/html\n\n";
  print "<form name=\"setpwd\" action=\"$script\" method=\"post\">\n";
  print "<center>管理者用パスワードを設定してください。<br>\n";
  print "<input type=input name=\"pwd\" size=20>\n";
  print "<input type=submit name=\"sub\" value=\"設定\">\n";
  print "<input type=hidden name=\"mode\" value=\"wradminpwd\">\n";
  print "</form>";
 }

パスワード入力ページを表示します。$scriptはこのスクリプト自身の名前が入っていると仮定します。hiddenにより設定ボタンがクリックされた後の処理を支持します。実際にはContent-Type表示の後に<html>や<body> のタグがあるべきですがここでは省略しています。

 sub wradminpwd {
    if (open(FILE,"> $adminpwd")){
        print FILE &makecrypt($q->param('pwd'));
        close(FILE);
    } else {
        print "Content-Type: text/html\n\n";
        print 'パスワードファイル作成に失敗しました';
        exit;
    }
  
    print "Location: $script\n\n";
 }

パスワードファイル作成処理部。この部分が実行されるとpwdで渡されたパラメータをサブルーチンmakecryptにより暗号化し$adminpwdファイルに保存します。$adminpwdが何らかの理由で作成できない場合にエラーメッセージを表示し、スクリプトを終了するようにしています。パスワードファイル作成後Locationタグによりこのスクリプトを自動的に再実行します。

関連するCGIテクニック

パスワード暗号化ルーチン
パスワードチェックの方法
管理用パスワードチェックの方法