我花了几个小时试图找到一种在php中编写跨平台密码提示的方法,该提示隐藏了用户输入的密码。虽然这可以通过使用stty -echo在Unix环境中轻松完成,但我尝试了各种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脚本包装在批处理文件中,并将密码作为命令行参数传递,但在这种情况下,这对我不起作用。
答案 0 :(得分:7)
似乎没有PHP的IOCTL或STTY扩展名。我找到了以下技巧here:
<?php
echo 'Password: ';
$pwd = preg_replace('/\r?\n$/', '', `stty -echo; head -n1 ; stty echo`);
echo "\n";
echo "Your password was: {$pwd}.\n";
?>
答案 1 :(得分:1)
这是一个Windows解决方案,使用PHP的COM扩展。我在Windows XP上使用PHP 5.2.6进行了测试。
<?php
$pwObj = new Com('ScriptPW.Password');
print "Password: ";
$passwd = $pwObj->getPassword();
echo "Your password is $passwd\n";
?>
答案 2 :(得分:-1)
我认为你不能在PHP中用标准库做到这一点,但你可以做得更好:
抓住第一个字母,然后显示*。抓住第二个,然后显示两个* ...
符合人体工程学,这很方便,因为用户可以看到他输入的内容。安全性没有风险,因为如果有人能够用一个字母一个字母看到密码,他就可以看到那个人在键盘上输入密码。但它仍然阻止某人偶然看到它。