5

ユーザーが入力したパスワードを非表示にするクロスプラットフォームのパスワードプロンプトをphpで作成する方法を見つけるのに数時間を費やしました。これは Unix 環境では stty -echo を使用して簡単に実現できますが、passthru() および system() 呼び出しのさまざまな方法を試して、Windows で同じことを実行しても無駄でした。

私が試してみました:

passthru('set /p pass=Password: ');
system('echo %pass% > out.txt');
$pass = file_get_contents('out.txt', 'r');

これは passthru('set /p pass=Password: '); でハングしているようです。テキストを入力することを許可せずに行を削除し、Ctrl-c で強制終了する必要があります。

また、fgetc と fgets のさまざまな方法を試し、バックスペース文字を出力して入力を非表示にしました。これは他の言語でも機能するためです。ただし、PHP はキャリッジ リターンの前のテキストとやり取りできないようです。

これを機能させる方法を本当に見つけたいのですが、これは不可能な作業ですか、それともできることですか?

php スクリプトをバッチ ファイルにラップして、パスワードをコマンド ライン引数として渡すことができることは承知していますが、この場合はうまくいきません。

4

3 に答える 3

7

PHP 用の IOCTL または STTY 拡張機能はないようです。ここで次のトリックを見つけました:

<?php
echo 'Password: ';
$pwd = preg_replace('/\r?\n$/', '', `stty -echo; head -n1 ; stty echo`);
echo "\n";
echo "Your password was: {$pwd}.\n";
?>
于 2008-11-18T05:41:26.480 に答える
1

これは、PHP の COM 拡張機能を使用した Windows ソリューションです。PHP 5.2.6 を搭載した Windows XP でこれをテストしました。

<?php

$pwObj = new Com('ScriptPW.Password');

print "Password: ";
$passwd = $pwObj->getPassword();

echo "Your password is $passwd\n";

?>
于 2008-11-18T16:46:42.550 に答える
-1

標準ライブラリを使用してPHPでそれを行うことはできないと思いますが、もっとうまくやることはできます:

最初の文字をキャッチして、* を表示します。2 番目のものをキャッチし、2 つの *... を表示します。

人間工学的には、これはユーザーが入力内容を確認できるため便利です。誰かがパスワードを 1 文字ずつ見ることができたとしても、その人がキーボードでパスワードを入力しているのを見ることができるため、セキュリティが危険にさらされることはありません。しかし、それは誰かが一度に偶然それを見るのを防ぎます.

于 2008-11-18T06:34:40.010 に答える