Beispiel für Login
bearbeitet von 1unitedpower> ~~~php
> define('PASSWORD', 'streng Geheim');
> ~~~
Passwörter als Klartext zu hinterlegen ist keine gute Idee. Besser man speichert nur einen gesalzenen Hash. Auf Linux-Systemen kann man sich mit dem folgenden Bash-Skript so einen Hash generieren lassen:
~~~bash
php -r 'echo "Passwort:"; system("stty -echo"); $password = rtrim(fgets(STDIN),"\n"); system("stty echo"); $hash = password_hash($password, PASSWORD_DEFAULT); echo $hash;'
~~~
Hier die Erläuterung:
`php -r` führt den nachfolgenden PHP-Code aus.
~~~php
echo "Passwort:"; // Fordert den Benutzer auf sein Passwort einzugeben
system("stty -echo"); // Deaktiviert die Bildschirmausgabe und verhindert, dass das Passwort in der Bash-History auftaucht
$password = rtrim(fgets(STDIN),"\n"); // Liest das Passwort ein
system("stty echo"); // Reaktiviert die Bildschirmausgabe von Zeichen
$hash = password_hash($password, PASSWORD_DEFAULT); // Erzeugt den gesalzenen Passwort-Hash
echo $hash; // Gibt den neu generierten Hash aus
~~~
**ACHTUNG:** Bei Windows funktioniert das Unterdrücken der Ausgabe wie oben nicht.
Beispielausgabe: `$2y$10$ysZS.7iJvmEantAioBKHK.CJ.jFRJGkzcRV5v.n0Zl1gZhc1YJ.ay`
Außerdem will man solche Konfigurations-Daten für gewöhnlich nicht im Quelltext stehen haben, das erschwert unter anderem die Versionierung und das Deployment ([Hintergrund](https://12factor.net/de/)) und macht es unsicherer. Ein besserer Speicherort dafür sind Umgebungsvariablen, wenn man behutsam damit umgeht. Damien Alexandre gibt dazu ein paar [Tipps](https://jolicode.com/blog/what-you-need-to-know-about-environment-variables-with-php).
Bei Apache-Webservern kann man mit der [SetEnv](https://httpd.apache.org/docs/2.4/mod/mod_env.html#setenv)-Direktive Umgebungsvariablen setzen.
~~~
SetEnv APP_PASSWORD $2y$10$ysZS.7iJvmEantAioBKHK.CJ.jFRJGkzcRV5v.n0Zl1gZhc1YJ.ay
~~~
In PHP kann man die Umgebungsvariable mit [getenv](http://php.net/manual/de/function.getenv.php) auslesen und mit [password_verify](http://php.net/manual/de/function.password-verify.php) auf sichere Weise mit der Benutzereingabe vergleichen:
~~~php
$password = $_POST['password'];
$hash = getenv('APP_PASSWORD');
$isPasswordCorrect = password_verify($password, $hash);
~~~