Sicherheit von PHP-Anwendungen: Top-10-Schwachstellen für Anfänger
PHP bleibt eine der beliebtesten Sprachen für die Webentwicklung, aber seine Flexibilität führt oft zu schwerwiegenden Sicherheitsfehlern. Für Anfänger ist es leicht, eine kritische Schwachstelle zu übersehen, die zu Datenlecks oder einem vollständigen Server-Hack führen kann. In diesem Artikel besprechen wir die 10 häufigsten Schwachstellen von PHP-Anwendungen, zeigen Beispiele für gefährlichen Code und bringen Ihnen bei, sich richtig zu schützen. Das Material wurde speziell für angehende Entwickler erstellt, die von Anfang an sicheren Code schreiben möchten.
1. SQL-Injection
Dies ist die bekannteste und gefährlichste Schwachstelle. Sie tritt auf, wenn Benutzereingaben direkt ohne Escape in eine SQL-Abfrage eingefügt werden. Ein Angreifer kann auf die Datenbank zugreifen, Daten ändern oder löschen.
Gefährlicher Code:
<?php$id = $_GET['id'];$query = "SELECT * FROM users WHERE id = $id";$result = mysqli_query($conn, $query);?>Wie man sich schützt: Verwenden Sie vorbereitete Anweisungen (prepared statements) mit PDO oder MySQLi.
<?php$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");$stmt->execute(['id' => $_GET['id']]);?>2. XSS (Cross-Site-Scripting)
XSS ermöglicht es einem Angreifer, bösartigen JavaScript-Code in eine Seite einzuschleusen, die anderen Benutzern angezeigt wird. Dies kann zum Diebstahl von Session-Cookies oder zur Weiterleitung auf Phishing-Seiten führen.
Gefährlicher Code:
<?phpecho "Hallo, " . $_GET['name'];?>Wie man sich schützt: Escapen Sie die Ausgabe immer mit htmlspecialchars().
<?phpecho "Hallo, " . htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8');?>3. CSRF (Cross-Site-Request-Forgery)
Ein CSRF-Angriff zwingt einen authentifizierten Benutzer dazu, eine unerwünschte Aktion auf der Website auszuführen (z. B. Passwort ändern oder Geld überweisen). Der Angriff erfolgt, wenn der Benutzer einem Link auf einer fremden Website folgt.
Wie man sich schützt: Verwenden Sie CSRF-Token für alle Formulare und Anfragen, die den Zustand ändern.
<?phpsession_start();if (empty($_SESSION['csrf_token'])) { $_SESSION['csrf_token'] = bin2hex(random_bytes(32));}?><form method="POST"> <input type="hidden" name="csrf_token" value="<?= $_SESSION['csrf_token'] ?>"> <button type="submit">Konto löschen</button></form>4. Unsicherer Umgang mit Dateien
Ermöglicht einem Angreifer, beliebige Dateien auf dem Server zu lesen oder zu schreiben. Zum Beispiel durch Path Traversal oder das Hochladen von PHP-Shells.
Gefährlicher Code:
<?phpinclude($_GET['page'] . '.php');?>Wie man sich schützt: Verwenden Sie niemals Benutzereingaben in Dateipfaden. Nutzen Sie Whitelists für zulässige Werte.
<?php$allowed_pages = ['home', 'about', 'contact'];$page = $_GET['page'] ?? 'home';if (in_array($page, $allowed_pages)) { include($page . '.php');} else { include('404.php');}?>5. Mängel bei der Authentifizierung und Sitzungsverwaltung
Schwache Passwörter, fehlender Schutz vor Brute-Force-Angriffen, Session-Fixation – all das öffnet den Weg zur Übernahme von Benutzerkonten.
Empfehlungen:
- Speichern Sie Passwörter nur gehasht mit
password_hash(). - Verwenden Sie HTTPS für alle Seiten mit Authentifizierung.
- Generieren Sie die Session-ID nach dem Login neu:
session_regenerate_id(true). - Legen Sie eine kurze Session-Lebensdauer fest.
6. Unsichere direkte Objektreferenz (IDOR)
ID