$stdin = fopen("php://stdin", "r");
$line = fgets($stdin, 64);
のようにすると、入力されたパスワードが画面に表示されてしまいます。
パスワードを画面に表示させずに入力させる良い方法をご存知でしたら教えてください。
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。