Я потратил несколько часов, пытаясь найти способ написания кросс-платформенного пароля в php, который скрывает пароль, который вводит пользователь. Хотя это легко достигается в средах Unix с помощью stty -echo, я пробовал различные способы вызовов passthru () и system (), чтобы сделать окна делать то же самое безрезультатно.
Я пытался:
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-скрипт в пакетном файле и передать пароль в качестве аргумента командной строки, но в этом случае это не работает.
Вот решение для Windows, использующее расширение COM для PHP. Я тестировал это в Windows XP с PHP 5.2.6.
<?php $pwObj = new Com('ScriptPW.Password'); print "Password: "; $passwd = $pwObj->getPassword(); echo "Your password is $passwd\n"; ?>
По-видимому, для 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"; ?>
Я думаю, вы не можете сделать это на PHP со стандартной библиотекой, но можете сделать лучше:
Поймайте первую букву, затем отобразите *. Поймайте второй, затем отобразите два * …
Эргономично, это удобно, потому что пользователь может видеть, что он ввел. Безопасность не подвержена риску, потому что, если кто-то может видеть пароль одной буквой на одну букву, он может видеть, что парень все равно вводит его на клавиатуре. Но это все еще мешает кому-то увидеть это случайно в одно время.