2008-11-18 5 views
5

He pasado varias horas tratando de encontrar un medio para escribir un mensaje de contraseña de plataforma cruzada en php que oculta la contraseña que ingresa el usuario. Si bien esto se logra fácilmente en entornos Unix mediante el uso de stty -echo, he intentado varios medios de llamadas passthru() y system() para hacer que Windows haga lo mismo sin éxito.¿Realmente no es posible escribir un mensaje de contraseña de php cli que oculte la contraseña en Windows?

que he intentado:

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

Esto parece colgar en el tránsito ('pase set/p = Contraseña:'); línea sin permitirme ingresar ningún texto y debe ser eliminada con Ctrl-c.

También he probado varios métodos de fgetc y fgets e impresión de caracteres de retroceso para ocultar la entrada, ya que funciona en otros idiomas. Sin embargo, PHP no parece poder interactuar con el texto antes de un retorno de carro.

Realmente me gustaría encontrar la manera de hacer que esto funcione, ¿es esto una tarea imposible o es algo que se puede hacer?

Tenga en cuenta que soy consciente de que podría ajustar la secuencia de comandos php en un archivo por lotes y pasar la contraseña como un argumento de línea de comandos, pero eso no funciona en este caso.

Respuesta

1

Aquí hay una solución de Windows, utilizando la extensión COM para PHP. Probé esto en Windows XP con PHP 5.2.6.

<?php 

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

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

echo "Your password is $passwd\n"; 

?> 
7

No parece haber una extensión IOCTL o STTY para PHP. He encontrado el siguiente truco here:

<?php 
echo 'Password: '; 
$pwd = preg_replace('/\r?\n$/', '', `stty -echo; head -n1 ; stty echo`); 
echo "\n"; 
echo "Your password was: {$pwd}.\n"; 
?> 
+0

Creo que está buscando compatibilidad con Windows, que no tiene stty. –

+0

¿Cuál es el contexto? La respuesta obvia sería usar un cuadro de texto con contraseña de eco, pero al parecer estás ... ¿qué? ¿Cómo solicitar una consola en el host? – dkretz

+0

@doof: Sí, el OP dijo que está ejecutando un script CLI. Él no dijo específicamente Windows, pero sí dijo "archivo por lotes", que es el lenguaje de Windows. –

-1

creo que no se puede hacer eso en PHP con la biblioteca estándar, pero se puede hacer mejor:

captura la primera letra, a continuación, mostrar un *. Captura el segundo, luego muestra dos * ...

Ergonómicamente, esto es útil porque el usuario puede ver lo que ha ingresado. La seguridad no está en riesgo porque si alguien puede ver la contraseña una letra por una letra, puede ver al tipo escribiéndola en el teclado de todos modos. Pero aún impide que alguien lo vea por accidente al mismo tiempo.

Cuestiones relacionadas