人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHP(CLI)のプログラムをコマンドラインで実行し、画面からパスワードを入力させたいと考えています。

$stdin = fopen("php://stdin", "r");
$line = fgets($stdin, 64);

のようにすると、入力されたパスワードが画面に表示されてしまいます。

パスワードを画面に表示させずに入力させる良い方法をご存知でしたら教えてください。



●質問者: yoski
●カテゴリ:コンピュータ インターネット
✍キーワード:CLI PHP コマンドライン パスワード プログラム
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● tobeoscontinue
●70ポイント

ANSI エスケープシーケンスに非表示(\033[8m)というのがあるのでこれで括ってやるのが一番簡単そうです。

function getpass($prompt) {
 $passwd = '';
 echo $prompt."\033[8m";
 $passwd = fgets(STDIN);
 echo "\033[0m";
 return $passwd;
}

echo getpass("Password:");

http://www.php.net/manual/ja/features.commandline.php#78672

を参考に書いてみました。

一文字読み込むのにbashのreadを使っているのでかなり効率悪いです。

function getKey() {
 // *を入力した場合、$valsではechoで*を展開するので入力されない。
 // ので"$valu"とする必要がある
 $ch = `read -s -n1 valu;echo -n "\$valu"`;
 if ($ch == chr(0x1b)) { // エスケープ文字列なら残りの文字も取り込む
 $ch .= `read -s -n1 valu;echo -n \$valu`; 
 $ch2 = `read -s -n1 valu;echo -n \$valu`;
 $ch .= $ch2;
 if (is_numeric($ch2))
 $ch .= `read -s -n1 valu;echo -n \$valu`; 
 }
 return $ch;
}

function getpass($prompt) {
 $passwd = '';
 echo $prompt;
 while (($ch = getKey()) != "") {
 if ($ch == chr(0x7f)) {
 if ($passwd) {
 $passwd = substr($passwd, 0, -1);
 echo "\033[1D \033[1D";
 } } else if (strlen($ch) == 1) {
 echo '*';
 $passwd .= $ch;
 }
 }
 return $passwd;
}

echo getpass("Password:");

表面的には機能を満足しているように見えますが、端末にはくわしくないのでセキュリティホールがあるかもしれません。

ダイレクト IO (DIO) 関数Ncurses 端末画面制御関数あたりが近いとは思いますがうまく出来ませんでしたorz。

◎質問者からの返答

おお、こんなエスケープシーケンスが。

大変助かります。試してみます。

ありがとうございました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ