Zugang D: Login
Das Login-Skript enthält die Steuerung der Session-Variable, die vorhanden sein muss, damit ein damit geschützter Bereich zugänglich wird.
Das bietet Angriffsfläche. Daher sollte es keine „Allerweltsvariable“ sein, ggf. kann auch noch ein dedizierter Wert eingetragen werden, der drin stehen (und abgefragt werden) muss.
Das damit erzeugte Formular ruft ein Javascript cookies.js
auf, mit dem eine Prüfung erfolgt, ob Cookies möglich sind – andernfalls scheitert die Zugangskontrolle.
Passen Passwort und Benutzernamen zusammen, wird eine (ggf. für jede Webseite eigene, dann jedoch „pflegeaufwändigere“) Session-Variable „oelogok“ mit einem Zufallswert generiert und als Cookie gesetzt. Es werden keine benutzerspezifischen Daten in der Session gespeichert.
Der eingegebene Benutzername muss in der Benutzerliste vorhanden sein, das eingegebene Passwort muss genau passen: A≠a
.
Die Skripte (PHP und JS) werden im Verzeichnis /user/
erwartet, in dem alle Daten für die Zugangskontrolle abgelegt werden.
- Weitere Infos dazu
Das Skript
Stand: 21.10.2022
Ladefehler: $$$ file a $$$
<?php
// Anmeldung prüfen
if(session_status() === PHP_SESSION_NONE) {
session_start();
}
$errlog = ''; // für Login-Fehler
$maintain = 'maintain'; // Wartungsseite für Passwort
if (isset($_POST["anmeldung"])) {
$errlog = '<label><blockquote><blockquote><blockquote>Falsche Anmeldedaten!<br/><a href="'.$maintain.'">Passwort vergessen?</a></blockquote></blockquote></blockquote></label>';
$lname = trim($_POST["name"]);
$lpass = trim($_POST["passwort"]);
$thefile = $_SERVER["DOCUMENT_ROOT"] . '/user/proof.txt';
$zeilen =explode("\n",file_get_contents($thefile)); // Textfile → Stringarray
//$zeilen = preg_split("/\\r\\n|\\r|\\n/", $zeilen); // Zeilenumbruch mit Regex gerade ziehen
foreach($zeilen as &$zeile) { // &$zeile → referenziert Inhalt → änderbar
if (strlen($zeile)<4) continue; // Leerzeilen überspringen
$zeile = preg_replace('/\s+/','',$zeile); // Leerzeichen weg
list($rname,$rpass) = explode(":", $zeile, 2);
if ($rname <> $lname) continue;
// Nur mit Hash abgleichen
if (($lname === $rname) && (password_verify($lpass,$rpass))) {
session_regenerate_id();
$_SESSION["benutzername"] = $lname;
// $_SESSION["benutzername"] = random_bytes(25); // → Das funktioniert NICHT mit der Maintain → Admin-Passwort strategie.
$errlog = ''; // Login erfolgreich → Fehlermeldung leeren
// Refresh, damit Session neu gelesen wird
header('Location: '.$_SERVER['REQUEST_URI']);
}
}
}
// Abmeldung
if (isset($_POST["abmeldung"])) {
// Session und Cookies löschen
unset($_SESSION["benutzername"]);
$_SESSION = [];
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000, $params["path"],
$params["domain"], $params["secure"], $params["httponly"]);
}
session_destroy();
header('Location: '.$_SERVER['REQUEST_URI']);
}
// Anmeldeformular → Passwortseite ggf. anpassen
if (!isset($_SESSION["benutzername"])) {
?>
<form method="post">
<legend>Zugang</legend>
<p><small>Bitte beachten: <code>A ≠ a</code></small></p><script language="javascript" type="text/javascript" src="/user/cookies.js"></script>
<div>
<label>E-Mail-Adresse:</label>
<input type="text" name="name" required="required" autocomplete="username" autofocus="autofocus">
</div>
<div>
<label>Passwort:</label>
<input type="password" name="passwort" required="required" autocomplete="current-password">
<input type="submit" name="anmeldung" value="Anmelden" />
</div>
<div>
<?php if (($errlog)) {echo $errlog;} else { echo '<label><small><a href="'.$maintain.'">Passwort vergessen?</small></label></a>';} ?>
</div>
</fieldset>
</form>
<?php
}
if (isset($_SESSION["benutzername"])) {
?>
<form method="post">
<legend>Zugang</legend>
<div>
<input type="submit" name="abmeldung" value="Abmelden" />
</div>
<div>
<label><a href="<?php echo $maintain ?>">Passwort ändern</a></label></label>
</div>
</form>
<?php
}
?>