我正在编写一个命令行工具来帮助我的网络应用程序.它需要密码才能连接到服务.我希望脚本显示密码提示,所以我不必将其作为命令行参数传递.
这很容易,但我希望它不会在键入屏幕时回显密码.我怎么能用PHP做到这一点?
在纯PHP(没有system('stty')
)和用字符替换字符的情况下的加分点*
.
编辑:
该脚本将在类似unix的系统(linux或mac)上运行.该脚本是用PHP编写的,很可能就是这样.
此外,为了记录,stty
这样做的方式是:
echo "Password: "; system('stty -echo'); $password = trim(fgets(STDIN)); system('stty echo'); // add a new line since the users CR didn't echo echo "\n";
我宁愿不system()
接听电话.
在sitepoint上找到.
function prompt_silent($prompt = "Enter Password:") { if (preg_match('/^win/i', PHP_OS)) { $vbscript = sys_get_temp_dir() . 'prompt_password.vbs'; file_put_contents( $vbscript, 'wscript.echo(InputBox("' . addslashes($prompt) . '", "", "password here"))'); $command = "cscript //nologo " . escapeshellarg($vbscript); $password = rtrim(shell_exec($command)); unlink($vbscript); return $password; } else { $command = "/usr/bin/env bash -c 'echo OK'"; if (rtrim(shell_exec($command)) !== 'OK') { trigger_error("Can't invoke bash"); return; } $command = "/usr/bin/env bash -c 'read -s -p \"" . addslashes($prompt) . "\" mypassword && echo \$mypassword'"; $password = rtrim(shell_exec($command)); echo "\n"; return $password; } }
根据您的环境(即不在Windows上),您可以使用ncurses库(特别是ncurses_noecho()函数来停止键盘回显,并使用ncurses_getch()来读取输入)以获取密码而不在屏幕上显示密码.
您可以使用我的hiddeninput.exe文件获取真正的隐藏输入,而不会在屏幕上的任何位置泄露信息.
如果删除最后一个回显,则密码永远不会显示,但您可以使用该密码进行验证.
出于显而易见的原因,在我的linux机器上不起作用.
我确信该项目中的hiddeninput.exe不会对安全构成重大威胁。.但是,使用来自互联网的随机二进制Blob处理密码并不是一个好习惯。即使这段代码是安全的,它也只是恶意行为者注入令人讨厌的东西的占位符...