Zugang D: Login

Erstellt: 08.03.2022 Lesedauer ≤ 1 Min.

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

Zugangskontrolle

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(":"$zeile2);    
    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
}  
  
?>