82 votes

Ligne de commande Invite de Mot de passe en PHP

Je suis en train d'écrire une ligne de commande outil pour aider mon application web. Il a besoin d'un mot de passe pour vous connecter au service. J'aimerais que le script pour afficher une invite de mot de passe donc je n'ai pas ce passer comme argument de ligne de commande.

C'est assez facile, mais j'aimerais qu'il ne l'écho le mot de passe à l'écran comme il est tapé. Comment puis-je le faire avec PHP?

Les points de Bonus pour le faire dans le plus pur PHP (pas de system('stty')) et en remplaçant les caractères avec des *.

EDIT:

Le script sera exécuté sur un unix comme système (linux ou mac). Le script est écrit en PHP, et aura plus de chances de rester comme ça.

Aussi, pour l'enregistrement, l' stty moyen de le faire est:

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";

Je préfère ne pas avoir l' system() des appels.

42voto

DaveHauenstein Points 254

Trouvé sur 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;
  }
}

11voto

Randy Points 3196

En fonction de votre environnement (c'est à dire, pas sur Windows), vous pouvez utiliser la bibliothèque ncurses (en particulier, les ncurses_noecho() fonction pour arrêter le clavier d'écho et de ncurses_getch() pour lire l'entrée) pour obtenir le mot de passe sans l'afficher à l'écran.

9voto

Seldaek Points 12311

Vous pouvez utiliser mon hiddeninput.exe fichier pour obtenir un réel caché d'entrée, sans fuite de l'information de n'importe où sur l'écran.

<?php

echo 'Enter password: ';
$password = exec('hiddeninput.exe');
echo PHP_EOL;

echo 'Password was: ' . $password . PHP_EOL;

Si vous supprimez la dernière écho, le mot de passe ne doit jamais montrer, mais vous pouvez l'utiliser pour la validation obvoiusly.

2voto

Gabriel Gilini Points 76

Je suppose qu'il n'y a pas de moyen simple de le faire (en fait je ne pense pas de toute façon) sans l'aide de stty -echo. Si vous avez l'intention de le faire fonctionner sur windows, vous pouvez créer un script batch qui fournirait la unechoed tapé info à votre script php.

@echo off
cls
SET /P uname=Enter Username:
echo hP1X500P[PZBBBfh#b##fXf-V@`$fPf]f3/f1/5++u5>in.com
set /p password=Enter password :<nul
for /f "tokens=*" %%i in ('in.com') do set password=%%i
del in.com
echo.
c:\php\php.exe d:\php\test.php %uname% "%password%"
Pause

exemple pris sur http://www.indiangnu.org/2008/php-hide-user-input-using-batch-script-windows/

1voto

robert petranovic Points 239

L'on a accepté la réponse n'est pas assez bon. Tout d'abord, le Windows solution ne fonctionne pas sur Windows 7 et au-dessus. La solution pour les autres systèmes d'exploitation dépend de Bash bash, et intégré dans le "lire". Cependant, il existe des systèmes qui n'utilisent pas de Bash (eg. OpenBSD) et où, de toute évidence, cela ne fonctionnera pas.

Dans ce blog , j'ai discuté solution qui fonctionne sur presque n'importe quel système d'exploitation basé sur Unix et de Windows de 95 à 8. Les solutions Windows utilise externe programme écrit en C sur le dessus de l'API Win32. La solution pour les autres systèmes d'exploitation utilise la commande externe 'stty'. Je n'ai pas encore vu un Unix système qui n'a pas de stty'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X