Autorisierung und Authentifizierung in PHP: Von den Grundlagen bis zum Schutz
Die Sicherheit von Webanwendungen beginnt mit der korrekten Implementierung der Authentifizierung (Überprüfung der Benutzeridentität) und der Autorisierung (Überprüfung seiner Zugriffsrechte). In PHP können diese Mechanismen sowohl mit integrierten Funktionen als auch mit spezialisierten Bibliotheken implementiert werden. In diesem Artikel werden wir die wichtigsten Konzepte erläutern, Codebeispiele schreiben und die besten Schutzpraktiken betrachten.
1. Grundlegende Konzepte: Authentifizierung vs. Autorisierung
Bevor wir Code schreiben, ist es wichtig, die beiden Begriffe klar abzugrenzen:
- Authentifizierung — der Prozess der Überprüfung, ob ein Benutzer derjenige ist, der er vorgibt zu sein (normalerweise durch Login und Passwort).
- Autorisierung — der Prozess der Bestimmung, welche Ressourcen oder Aktionen einem authentifizierten Benutzer zur Verfügung stehen (z. B. die Rolle "admin" oder "user").
Fehler bei der Implementierung einer dieser Phasen können zu Datenlecks oder unbefugtem Zugriff führen.
2. Basisauthentifizierung über Sessions (natives PHP)
Die gebräuchlichste Methode ist die Verwendung von Sessions. PHP bietet den integrierten Mechanismus $_SESSION. Betrachten wir ein einfaches Beispiel.
Schritt 1: Anmeldeformular (login.php)
<?phpsession_start();?><!DOCTYPE html><html><head> <title>Anmeldung auf der Website</title></head><body> <form method="POST" action="login.php"> <label>Benutzername:</label> <input type="text" name="username" required> <label>Passwort:</label> <input type="password" name="password" required> <button type="submit" name="login">Anmelden</button> </form></body></html>Schritt 2: Verarbeitung der Anmeldung (gleiche login.php)
<?phpsession_start();require_once 'db.php'; // Verbindung zur Datenbank
if (isset($_POST['login'])) { $username = trim($_POST['username']); $password = $_POST['password'];
// 1. Prepared Statement zum Schutz vor SQL-Injection $stmt = $pdo->prepare("SELECT id, password_hash FROM users WHERE username = ?"); $stmt->execute([$username]); $user = $stmt->fetch();
// 2. Passwortprüfung mit password_verify if ($user && password_verify($password, $user['password_hash'])) { // Authentifizierung erfolgreich $_SESSION['user_id'] = $user['id']; $_SESSION['logged_in'] = true; header("Location: dashboard.php"); exit; } else { $error = "Ungültiger Benutzername oder Passwort"; }}?>Schritt 3: Autorisierungsprüfung auf einer geschützten Seite
<?phpsession_start();if (!isset($_SESSION['logged_in']) || $_SESSION['logged_in'] !== true) { header("Location: login.php"); exit;}// Zugriff erlaubtecho "Willkommen, Benutzer #" . htmlspecialchars($_SESSION['user_id']);?>3. Passwort-Hashing: Speichern Sie Passwörter niemals im Klartext
PHP bietet sichere Funktionen für die Arbeit mit Passwörtern:
password_hash($password, PASSWORD_BCRYPT)— erstellt automatisch einen Hash mit Salt.password_verify($password, $hash)— überprüft das Passwort gegen den Hash.
Beispiel für die Benutzerregistrierung:
<?php$password = "user123";$hash = password_hash($password, PASSWORD_BCRYPT);// $hash in der Datenbank speichern$stmt = $pdo->prepare("INSERT INTO users (username, password_hash) VALUES (?, ?)");$stmt->execute([$username, $hash]);?>Wichtig: Verwenden Sie niemals md5() oder sha1() für Passwörter – sie sind veraltet und leicht zu knacken.
4. Rollenbasierte Autorisierung (Role-Based Access Control)
Zur Rechteverwaltung
Auch in der Bibliothek
RestSharp für C# (.NET): Vollständige Anleitung mit Beispielen
Testen in JavaScript (Node.js): Frameworks und Werkzeuge
BenchmarkDotNet für C# (.NET): Komplettguide mit Beispielen
Redis-Client für Kotlin: Lettuce und Kreds – Vergleich und Beispiele
CORS für JavaScript (Node.js): Komplettleitfaden mit Beispielen