Vorlesung 5
PHP und mySQL

Login & Anmeldung mit PHP: Personalisierte Webanwendungen

Einführung

Die Login- und Anmeldefunktionalitäten sind zentrale Elemente personalisierter Webanwendungen. Sie ermöglichen es Benutzern, sich zu identifizieren und auf personalisierte Inhalte und Dienste zuzugreifen. Im Folgenden wird erklärt, wie diese Funktionen mithilfe von PHP implementiert werden können.

Anmeldeformular

Ein Anmeldeformular ist der erste Schritt, um neue Benutzer zu registrieren. Es sammelt grundlegende Informationen wie Benutzername und Passwort. Ein Beispielcode für ein einfaches Anmeldeformular in PHP könnte wie folgt aussehen:

<!DOCTYPE html>
<html lang="de">
  <head>
    <meta charset="UTF-8">
    <title>Registrierung</title>
  </head>
  <body>
    <h2>Registrierung</h2>
    <form action="anmelden.php" method="post">
      <label for="username">Benutzername:</label>
      <input type="text" id="username" name="username" required><br>
      <label for="password">Passwort:</label>
      <input type="password" id="password" name="password" required><br>
      <input type="submit" value="Registrieren">
    </form>
  </body>
</html>

Verarbeiten der Anmeldung

Das Anmeldeskript speichert die Benutzerdaten sicher in einer Datenbank. Hier ist ein einfaches Beispiel, wie dies in PHP umgesetzt werden kann:

<?php
// Verbindung zur Datenbank herstellen
$conn = new mysqli('localhost', 'benutzer', 'passwort', 'datenbank');

if ($conn->connect_error) {
  die('Verbindung fehlgeschlagen: ' . $conn->connect_error);
}

// Benutzereingaben abrufen und sichern
$username = $conn->real_escape_string($_POST['username']);
$password = password_hash($_POST['password'], PASSWORD_BCRYPT);

// Benutzerdaten in die Datenbank einfügen
$sql = "INSERT INTO benutzer (username, password) VALUES ('$username', '$password')";
if ($conn->query($sql) === TRUE) {
  echo "Registrierung erfolgreich!";
} else {
  echo "Fehler: " . $sql . "<br>" . $conn->error;
}

$conn->close();
?>

Login-Formular

Ein Login-Formular ermöglicht registrierten Benutzern den Zugang zu geschützten Bereichen der Website. Ein Beispiel hierfür:

<!DOCTYPE html>
<html lang="de">
  <head>
    <meta charset="UTF-8">
    <title>Login</title>
  </head>
  <body>
    <h2>Login</h2>
      <form action="login.php" method="post">
        <label for="username">Benutzername:</label>
        <input type="text" id="username" name="username" required><br>
        <label for="password">Passwort:</label>
        <input type="password" id="password" name="password" required><br>
        <input type="submit" value="Einloggen">
    </form>
  </body>
</html>

Verarbeiten des Logins

Das Loginskript überprüft die Anmeldedaten und authentifiziert den Benutzer. Hier ein Beispiel:

<?php
// Verbindung zur Datenbank herstellen
$conn = new mysqli('localhost', 'benutzer', 'passwort', 'datenbank');

if ($conn->connect_error) {
  die('Verbindung fehlgeschlagen: ' . $conn->connect_error);
}

// Benutzereingaben abrufen und sichern
$username = $conn->real_escape_string($_POST['username']);
$password = $_POST['password'];

// Benutzerdaten aus der Datenbank abrufen
$sql = "SELECT password FROM benutzer WHERE username = '$username'";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
  $row = $result->fetch_assoc();
if (password_verify($password, $row['password'])) {
  echo "Login erfolgreich!";
// Sitzung starten und Benutzerdaten speichern
session_start();
  $_SESSION['username'] = $username;
} else {
  echo "Falsches Passwort.";
}
} else {
  echo "Benutzername nicht gefunden.";
}

$conn->close();
?>

Zusammenfassung

Mit diesen grundlegenden Schritten können Sie eine einfache und sichere Login- und Anmeldefunktion für Ihre PHP-basierten Webanwendungen erstellen. Diese Funktionen sind unerlässlich, um personalisierte Inhalte und Dienste anzubieten, die den Benutzern eine individuelle und maßgeschneiderte Erfahrung bieten.

Einführung in die Sitzungsverwaltung

Sitzungsverwaltung ist ein zentraler Bestandteil der Webprogrammierung, um Benutzerdaten über mehrere Anfragen hinweg zu speichern. Sitzungen ermöglichen es, den Zustand eines Benutzers zu verfolgen und personalisierte Erlebnisse zu bieten. In Webanwendungen werden Sitzungen häufig verwendet, um Benutzerauthentifizierung, Warenkörbe und Benutzereinstellungen zu verwalten.

Rolle von Cookies in der Sitzungsverwaltung

Cookies spielen eine entscheidende Rolle in der Sitzungsverwaltung, da sie eine Möglichkeit bieten, Sitzungs-IDs auf dem Client zu speichern. Die Sitzungs-ID wird bei jeder Anfrage an den Server zurückgesendet, wodurch der Server den Benutzer identifizieren und die zugehörigen Sitzungsdaten abrufen kann.

Ablauf der Sitzungsidentifikation mit Cookies

Der Ablauf der Sitzungsidentifikation mit Cookies kann in mehrere Schritte unterteilt werden:

  1. Erstellung der Sitzung: Wenn ein Benutzer eine Webanwendung besucht, erstellt der Server eine neue Sitzung und generiert eine eindeutige Sitzungs-ID.
  2. Setzen des Cookies: Die Sitzungs-ID wird in einem Cookie gespeichert und an den Client gesendet.
  3. Rücksendung des Cookies: Bei jeder weiteren Anfrage des Benutzers wird das Cookie mit der Sitzungs-ID an den Server zurückgesendet.
  4. Abgleich der Sitzungs-ID: Der Server verwendet die Sitzungs-ID, um die zugehörigen Sitzungsdaten abzurufen und die Anfrage des Benutzers zu verarbeiten.
  5. Sitzungsbeendigung: Die Sitzung kann durch den Benutzer (z.B. durch Abmelden) oder automatisch nach einer bestimmten Inaktivitätsdauer beendet werden.

Unterschied zwischen Sitzungs-Cookies und dauerhaften Cookies

Es gibt zwei Haupttypen von Cookies, die für die Sitzungsverwaltung verwendet werden:

  • Sitzungs-Cookies: Diese Cookies existieren nur während der Browsersitzung des Benutzers und werden gelöscht, wenn der Browser geschlossen wird. Sie sind ideal für temporäre Daten, die nur während einer einzigen Sitzung benötigt werden.
  • Dauerhafte Cookies: Diese Cookies bleiben auch nach dem Schließen des Browsers bestehen und haben ein Ablaufdatum. Sie werden für längerfristige Daten verwendet, wie z.B. Benutzereinstellungen oder Anmeldeinformationen, die zwischen Sitzungen beibehalten werden sollen.

Sicherheitsaspekte bei der Verwendung von Sitzungs-Cookies

Die Verwendung von Sitzungs-Cookies bringt einige Sicherheitsrisiken mit sich, die berücksichtigt werden müssen:

  • Session Hijacking: Dies tritt auf, wenn ein Angreifer die Sitzungs-ID eines Benutzers stiehlt und verwendet, um sich als dieser Benutzer auszugeben. Um dies zu verhindern, sollten Sitzungs-IDs komplex und schwer zu erraten sein und bei jeder Anmeldung des Benutzers erneuert werden.
  • Cross-Site Scripting (XSS): Angreifer können XSS-Angriffe nutzen, um JavaScript-Code in eine Webseite einzuschleusen, der Cookies ausliest und an den Angreifer sendet. Um dies zu verhindern, sollten alle Eingaben des Benutzers validiert und entschärft werden.
  • Cross-Site Request Forgery (CSRF): Bei CSRF-Angriffen wird ein Benutzer dazu gebracht, eine ungewollte Aktion auf einer Webseite auszuführen, bei der er angemeldet ist. Um dies zu verhindern, sollten Anti-CSRF-Token verwendet werden.

Best Practices für den sicheren Einsatz von Sitzungs-Cookies

Um die Sicherheit bei der Verwendung von Sitzungs-Cookies zu erhöhen, sollten folgende Best Practices beachtet werden:

  • Verwende HttpOnly Cookies, um zu verhindern, dass Cookies durch JavaScript ausgelesen werden können.
  • Setze die Secure Option, damit Cookies nur über HTTPS gesendet werden.
  • Verwende SameSite Cookies, um zu verhindern, dass Cookies bei Cross-Site-Anfragen gesendet werden.
  • Regelmäßige Erneuerung der Sitzungs-IDs, insbesondere nach sensiblen Aktionen wie der Anmeldung.
  • Beschränke die Lebensdauer von Sitzungs-Cookies auf ein Minimum, um das Risiko bei gestohlenen Sitzungs-IDs zu minimieren.

In der Webentwicklung ist die Verwaltung von Sitzungen (Sessions) eine entscheidende Aufgabe, um Benutzerdaten über mehrere Seitenaufrufe hinweg zu speichern. Sitzungen ermöglichen es, Informationen wie Benutzeranmeldungen, Warenkörbe oder Benutzerpräferenzen sicher und effizient zu speichern. Eine gängige Methode zur Identifikation und Verwaltung von Sitzungen ist die Verwendung von Session-IDs, die serverseitig gespeichert werden.

Ablauf einer Sitzung

  • Sitzungserstellung: Beim ersten Zugriff eines Benutzers auf eine Webanwendung wird eine neue Sitzung erstellt. Der Server generiert eine eindeutige Sitzungs-ID (Session ID), die den Benutzer während seiner gesamten Sitzung eindeutig identifiziert.
  • Speicherung der Sitzungs-ID: Die Sitzungs-ID wird in einem Cookie auf dem Client-Rechner gespeichert und bei jeder weiteren Anfrage an den Server zurückgesendet.
  • Verwaltung der Sitzung: Der Server verwendet die Sitzungs-ID, um auf die entsprechenden Sitzungsdaten zuzugreifen und diese zu verwalten. Diese Daten werden typischerweise in einer serverseitigen Datenbank oder in Dateisystemen gespeichert.
  • Beendigung der Sitzung: Eine Sitzung kann durch Benutzeraktionen (wie das Abmelden) oder durch Inaktivität (Session-Timeout) beendet werden. Nach der Beendigung der Sitzung werden die zugehörigen Daten gelöscht.

Vorteile der Sitzungsverwaltung

  • Sicherheit: Da die eigentlichen Sitzungsdaten serverseitig gespeichert werden, sind sie weniger anfällig für Manipulationen durch den Client.
  • Datenintegrität: Die Verwendung von Sitzungen stellt sicher, dass die Daten zwischen verschiedenen Seitenaufrufen konsistent bleiben.
  • Einfache Implementierung: Viele Webframeworks bieten eingebaute Unterstützung für Sitzungen, was die Implementierung erleichtert.

Sitzungen in PHP

PHP bietet eine einfache und effiziente Möglichkeit zur Verwaltung von Sitzungen. Hier sind die grundlegenden Schritte:

Sitzung starten:

<?php
session_start();
?>

Speichern von Daten in der Sitzung:

<?php
// Starte die Session
session_start();

// Speichere Benutzerdaten
$_SESSION['username'] = 'JohnDoe';
$_SESSION['email'] = '[email protected]';
?>

Zugriff auf Sitzungsdaten:

<?php
session_start();

if (isset($_SESSION['username'])) {
    echo "Willkommen, " . $_SESSION['username'];
} else {
    echo "Bitte melden Sie sich an.";
}
?>

Beenden der Sitzung:

<?php
session_start();

// Alle Session-Variablen löschen
$_SESSION = array();

// Session-Cookie löschen
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 zerstören
session_destroy();

echo "Sie wurden abgemeldet.";
?>

Sicherheitsaspekte

  • Sitzungs-Timeout: Durch das Festlegen eines Sitzungs-Timeouts kann verhindert werden, dass Sitzungen über einen längeren Zeitraum hinweg aktiv bleiben, was die Sicherheit erhöht.
  • Regenerierung der Sitzungs-ID: Durch regelmäßiges Regenerieren der Sitzungs-ID kann das Risiko von Session-Fixation-Angriffen minimiert werden.
    <?php
    session_start();
    session_regenerate_id(true);
    ?>

Beispiel: Benutzeranmeldung mit Sitzungen

Hier ist ein einfaches Beispiel für die Implementierung einer Benutzeranmeldung mit Sitzungen in PHP:

Anmeldung.php

<?php
session_start();

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $username = $_POST['username'];
    $password = $_POST['password'];

    // Dummy-Überprüfung der Anmeldedaten
    if ($username == 'admin' && $password == 'password') {
        $_SESSION['username'] = $username;
        header('Location: willkommen.php');
    } else {
        echo "Ungültige Anmeldedaten";
    }
}
?>

<!-- HTML-Formular für die Anmeldung -->
<form method="post" action="anmeldung.php">
    Benutzername: <input type="text" name="username"><br>
    Passwort: <input type="password" name="password"><br>
    <input type="submit" value="Anmelden">
</form>

Willkommen.php

<?php
session_start();

if (isset($_SESSION['username'])) {
    echo "Willkommen, " . $_SESSION['username'];
} else {
    echo "Bitte melden Sie sich an.";
}
?>

Logout.php

<?php
session_start();
session_destroy();
header('Location: anmeldung.php');
?>

Fazit

Die Verwaltung von Sitzungen über Sessions ist eine sichere und effektive Methode, um Benutzerdaten über mehrere Seitenaufrufe hinweg zu speichern und zu verwalten. Durch den richtigen Einsatz von Sitzungen und Sicherheitsmaßnahmen können Entwickler robuste und benutzerfreundliche Webanwendungen erstellen.

Identifikation von Sitzungen über Sessions

In der Webentwicklung ist die Verwaltung von Sitzungen (Sessions) eine entscheidende Aufgabe, um Benutzerdaten über mehrere Seitenaufrufe hinweg zu speichern. Sitzungen ermöglichen es, Informationen wie Benutzeranmeldungen, Warenkörbe oder Benutzerpräferenzen sicher und effizient zu speichern. Eine gängige Methode zur Identifikation und Verwaltung von Sitzungen ist die Verwendung von Session-IDs, die serverseitig gespeichert werden.

Ablauf einer Sitzung

  • Sitzungserstellung: Beim ersten Zugriff eines Benutzers auf eine Webanwendung wird eine neue Sitzung erstellt. Der Server generiert eine eindeutige Sitzungs-ID (Session ID), die den Benutzer während seiner gesamten Sitzung eindeutig identifiziert.
  • Speicherung der Sitzungs-ID: Die Sitzungs-ID wird in einem Cookie auf dem Client-Rechner gespeichert und bei jeder weiteren Anfrage an den Server zurückgesendet.
  • Verwaltung der Sitzung: Der Server verwendet die Sitzungs-ID, um auf die entsprechenden Sitzungsdaten zuzugreifen und diese zu verwalten. Diese Daten werden typischerweise in einer serverseitigen Datenbank oder in Dateisystemen gespeichert.
  • Beendigung der Sitzung: Eine Sitzung kann durch Benutzeraktionen (wie das Abmelden) oder durch Inaktivität (Session-Timeout) beendet werden. Nach der Beendigung der Sitzung werden die zugehörigen Daten gelöscht.

Vorteile der Sitzungsverwaltung

  • Sicherheit: Da die eigentlichen Sitzungsdaten serverseitig gespeichert werden, sind sie weniger anfällig für Manipulationen durch den Client.
  • Datenintegrität: Die Verwendung von Sitzungen stellt sicher, dass die Daten zwischen verschiedenen Seitenaufrufen konsistent bleiben.
  • Einfache Implementierung: Viele Webframeworks bieten eingebaute Unterstützung für Sitzungen, was die Implementierung erleichtert.

Sitzungen in PHP

PHP bietet eine einfache und effiziente Möglichkeit zur Verwaltung von Sitzungen. Hier sind die grundlegenden Schritte:

Sitzung starten:

<?php
session_start();
?>

Speichern von Daten in der Sitzung:

<?php
// Starte die Session
session_start();

// Speichere Benutzerdaten
$_SESSION['username'] = 'JohnDoe';
$_SESSION['email'] = '[email protected]';
?>

Zugriff auf Sitzungsdaten:

<?php
session_start();

if (isset($_SESSION['username'])) {
    echo "Willkommen, " . $_SESSION['username'];
} else {
    echo "Bitte melden Sie sich an.";
}
?>

Beenden der Sitzung:

<?php
session_start();

// Alle Session-Variablen löschen
$_SESSION = array();

// Session-Cookie löschen
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 zerstören
session_destroy();

echo "Sie wurden abgemeldet.";
?>

Sicherheitsaspekte

  • Sitzungs-Timeout: Durch das Festlegen eines Sitzungs-Timeouts kann verhindert werden, dass Sitzungen über einen längeren Zeitraum hinweg aktiv bleiben, was die Sicherheit erhöht.
  • Regenerierung der Sitzungs-ID: Durch regelmäßiges Regenerieren der Sitzungs-ID kann das Risiko von Session-Fixation-Angriffen minimiert werden.
    <?php
    session_start();
    session_regenerate_id(true);
    ?>

Beispiel: Benutzeranmeldung mit Sitzungen

Hier ist ein einfaches Beispiel für die Implementierung einer Benutzeranmeldung mit Sitzungen in PHP:

Anmeldung.php

<?php
session_start();

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $username = $_POST['username'];
    $password = $_POST['password'];

    // Dummy-Überprüfung der Anmeldedaten
    if ($username == 'admin' && $password == 'password') {
        $_SESSION['username'] = $username;
        header('Location: willkommen.php');
    } else {
        echo "Ungültige Anmeldedaten";
    }
}
?>

<!-- HTML-Formular für die Anmeldung -->
<form method="post" action="anmeldung.php">
    Benutzername: <input type="text" name="username"><br>
    Passwort: <input type="password" name="password"><br>
    <input type="submit" value="Anmelden">
</form>

Willkommen.php

<?php
session_start();

if (isset($_SESSION['username'])) {
    echo "Willkommen, " . $_SESSION['username'];
} else {
    echo "Bitte melden Sie sich an.";
}
?>

Logout.php

<?php
session_start();
session_destroy();
header('Location: anmeldung.php');
?>

Fazit

Die Verwaltung von Sitzungen über Sessions ist eine sichere und effektive Methode, um Benutzerdaten über mehrere Seitenaufrufe hinweg zu speichern und zu verwalten. Durch den richtigen Einsatz von Sitzungen und Sicherheitsmaßnahmen können Entwickler robuste und benutzerfreundliche Webanwendungen erstellen.

Passwörter und Passwortsicherheit

Passwörter sind ein wesentlicher Bestandteil der Sicherheitsmechanismen, die den Zugang zu sensiblen Informationen und Systemen schützen. Ihre Sicherheit ist von größter Bedeutung, um unbefugten Zugriff zu verhindern. In diesem Abschnitt werden wir die Grundlagen der Passwortsicherheit, Hashes und Salted Hashes erläutern.

Passwörter

Ein Passwort ist eine geheime Zeichenfolge, die verwendet wird, um einen Benutzer zu authentifizieren und Zugang zu einem System oder Dienst zu gewähren. Ein sicheres Passwort sollte lang genug sein und eine Mischung aus Buchstaben, Zahlen und Sonderzeichen enthalten, um die Sicherheit zu erhöhen.

Passwortsicherheit

Passwortsicherheit bezieht sich auf Maßnahmen, die getroffen werden, um Passwörter vor Diebstahl und Missbrauch zu schützen. Zu den bewährten Methoden gehören:

  • Länge und Komplexität: Verwenden Sie lange Passwörter (mindestens 12 Zeichen) mit einer Kombination aus Groß- und Kleinbuchstaben, Zahlen und Sonderzeichen.
  • Vermeidung von Wiederverwendung: Vermeiden Sie die Wiederverwendung von Passwörtern über verschiedene Konten hinweg.
  • Regelmäßige Aktualisierung: Ändern Sie Passwörter regelmäßig, um die Sicherheit zu erhöhen.

Hashes

Ein Hash ist eine Einweg-Verschlüsselung, die eine Zeichenfolge in eine feste Länge und scheinbar zufällige Zeichenfolge umwandelt. Hashes sind nützlich, um Passwörter sicher in Datenbanken zu speichern, da der Originalwert nicht aus dem Hash wiederhergestellt werden kann.

Ein Beispiel für das Hashing eines Passworts in PHP:

<?php
$password = 'meinSicheresPasswort';
$hash = password_hash($password, PASSWORD_BCRYPT);
echo $hash;
?>

Salted Hashes

Ein Salt ist eine zufällige Zeichenfolge, die zu einem Passwort hinzugefügt wird, bevor es gehasht wird. Dies erhöht die Sicherheit, indem es verhindert, dass gleiche Passwörter zu gleichen Hashes führen. Salts schützen auch vor sogenannten Rainbow-Table-Angriffen, bei denen vorgehashte Passwörter verwendet werden, um Hashes schnell nachzuschlagen.

PHP's password_hash Funktion verwendet automatisch einen Salt, wenn es ein Passwort hasht:

<?php
// Generiere einen Salt und hashe das Passwort
$password = 'meinSicheresPasswort';
$hash = password_hash($password, PASSWORD_BCRYPT);
echo $hash;

// Überprüfe das Passwort
if (password_verify($password, $hash)) {
    echo "Passwort ist gültig!";
} else {
    echo "Ungültiges Passwort.";
}
?>

Best Practices

Hier sind einige bewährte Methoden zur Sicherung von Passwörtern in Webanwendungen:

  • Verwenden Sie starke Hashing-Algorithmen: Algorithmen wie bcrypt, scrypt oder Argon2 sind speziell für das sichere Hashing von Passwörtern entwickelt worden.
  • Implementieren Sie Zwei-Faktor-Authentifizierung (2FA): Zusätzliche Sicherheitsschicht durch die Verwendung eines zweiten Authentifizierungsfaktors neben dem Passwort.
  • Begrenzen Sie die Anzahl der Anmeldeversuche: Verhindern Sie Brute-Force-Angriffe, indem Sie die Anzahl der möglichen Anmeldeversuche begrenzen und Benutzer nach einer bestimmten Anzahl von Fehlversuchen sperren.
  • Überwachen und Protokollieren Sie Anmeldeversuche: Überwachen Sie Anmeldeaktivitäten, um verdächtige Anmeldeversuche frühzeitig zu erkennen.

Fazit

Die Sicherung von Passwörtern ist ein entscheidender Aspekt der Websicherheit. Durch den Einsatz starker Passwörter, Hashing-Techniken und Salting sowie der Implementierung bewährter Sicherheitspraktiken können Entwickler sicherstellen, dass Benutzerdaten gut geschützt sind.