Term::ReadPassword  Ver.0.01

by oota( oota@itp.nec.co.jp )(2002/5/17)

Term::ReadPasswordモジュールの翻訳です。

原本の著作権はTom Phoenix氏がお持ちです。
Tom Phoenixさんには了解をいただきました。

なお内容等が間違っていたら修正します。ご連絡ください。



名前

Term::ReadPassword - ユーザにパスワードを問い合わせる


概要

  use Term::ReadPassword;
  while (1) {
    my $password = read_password('password: ');
    redo unless defined $password;
    if ($password eq 'flubber') {
      print "Access granted.\n";
      last;
    } else {
      print "Access denied.\n";
      redo;
    }
  }


説明

このモジュールは、エコーを伴わない、キーボードからの入力という一般的な方法で、 ユーザにパスワードを問い合わせる。

これは、Web上で使う事を目的とはしていない。Web上でのユーザ認証はまた別の方法だ からである。また、このモジュールは、一般的に、別に存在している Perlの crypt() 関数と 共に使うべきである。

read_password 関数は入力のためにプロンプトを表示し、キーボードから1行のテキスト を読み、呼び出し側にその行を返す。その行には改行文字は含まれないので、chompを 行なう必要はない。

ユーザがテキストを入力している間、幾つかの特別な文字が処理される。delete文字(又は backspace文字)は1文字を保存し、入力バッファ(あれば)中の最後の文字を取り去る。 CR文字(又はLF文字)は入力の最後というシグナルを発生し、累積された入力バッファを返す。 さらに、選択的に、コントロール-C文字は入力操作を終了する(詳細は下記参照)。 すべての、通常特殊な目的に使用されているその他の文字は入力バッファに追加される。

パスワードとして、未定義のコントロール文字を使うことは、それらの文字がこのモジュールの 将来のバージョンで意味を持つようになるかもしれないので推奨されない。アプリケーション 固有のパスワードをユーザに使わせるアプリケーションは、たとえば以下のようなコードで、 このルールを望んでもよい。

    {
      # Naked block for scoping and redo
      my $new_pw = read_password("Enter your new password: ");
      if ($new_pw =~ /([^\x20-\x7E])/) {
        my $bad = unpack "H*", $1;
print "Your password may not contain the ";
print "character with hex code $bad.\n";
redo;
      } elsif (length($new_pw) < 5) {
        print "Your password must be longer than that!\n";
redo;
      } elsif ($new_pw ne read_password("Enter it again: ")) {
print "Passwords don't match.\n";
redo;
      } else {
        &change_password($new_pw);
print "Your password is now changed.\n";
      }
    }

二番目のパラメータ read_password は任意で idle_timeout値である。 もしもこれが0以外の数値であり、その数値秒数だけキー入力がなければ、入力操作は 終了する。これは全体でのタイムリミットではなく、新しい文字入力ごとに再設定 されることに注意。

三番目のパラメータは任意で、コントロール-Cでユーザが入力操作を終了する事を 許可する。もしもこのパラメータが与えられないか、偽であれば、その他の文字と同じ ように、コントロール-C は入力バッファに入る。この場合、入力待ち状態中にキーボード からプログラムを終了させる方法はない(言い換えれば、キーボードからの通常のシグナル 発生機能は、read_passwordを呼び出している間抑制される)。

もしも、入力操作が早めに終了したら(アイドルタイムアウトが経過した、あるいは コントロール-Cが有効になっていて入力された)、戻り値は undef である。 もしも、そのどちらのケースでも、早めに終了する前に入力された(もしもあれば) 値を調べる方法と、なぜ入力操作が終わったかを調べるはない。

そのため、プロンプト以外の任意の場所でパスワードをタイプする事を防ぐために、 プロンプトの表示の前に入力された文字は捨てられる。そして、入力の終了が通常か 否かにかかわらず、プロンプトの後の行にカーソルが残らないように改行文字が表示 される。


セキュリティ

パスワードを扱うモジュールは、多くのセキュリティ問題を抱えることを考えねばならない。 勿論考えているだろうが、その考えは間違いである。たとえば、perlはメモリ中から データを消去する方法を持たない(確かに、データを消すのは簡単で、perlがアクセスできなく なるが、それは実際のメモリから消え去ることと同値ではない)。すでに消去された パスワードを含む変数を使ったとしても、もしもパスワードを入力したならば、 コアダンプで、平文で、任意の誰かがパスワードを見つけることは可能である。そして、 それはセキュリティホールの可能性につながる。

端的に言えば、もしもセキュリティ的な重要性を必要とするのであれば、このモジュールを 使うべきではない。


著者

Tom Phoenix <rootbeer@redcat.com>


訳者

太田俊哉 < oota@itp.nec.co.jp >


参照

Term::ReadLine, perlfunc/crypt, and your system's manpages for the low-level I/O operations used here.


ホーム Perlの小技

ご意見、ご質問はこちらの掲示板で受け付けています。
またメールは河馬屋(Nifty)にお願いします。