5

我花了几个小时试图找到一种在 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 脚本包装在批处理文件中并将密码作为命令行参数传递,但在这种情况下这对我不起作用。

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

这是一个 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";

?>
于 2008-11-18T16:46:42.550 回答
-1

我认为你不能用标准库在 PHP 中做到这一点,但你可以做得更好:

抓住第一个字母,然后显示 *。抓住第二个,然后显示两个 *...

从人体工程学上讲,这很方便,因为用户可以看到他输入的内容。安全性没有风险,因为如果有人可以一个字母一个字母地看到密码,那么他无论如何都可以看到那个人在键盘上输入密码。但它仍然可以防止有人在一次意外中看到它。

于 2008-11-18T06:34:40.010 回答