Top-10 Schwachstellen von PHP-Anwendungen: So schützen Sie Ihren Code
PHP bleibt eine der beliebtesten Sprachen für die Webentwicklung. Allerdings führen seine Flexibilität und Einfachheit oft zum Auftreten kritischer Schwachstellen. Laut OWASP-Statistik haben über 70 % der Webanwendungen mindestens eine schwerwiegende Sicherheitslücke. In diesem Artikel analysieren wir die 10 häufigsten Schwachstellen von PHP-Anwendungen, zeigen Beispiele für gefährlichen Code und geben praktische Empfehlungen zum Schutz.
1. SQL-Injection
Der bekannteste und gefährlichste Angriff. Der Angreifer schleust SQL-Code über Benutzereingaben ein.
Gefährlicher Code:
<?php$id = $_GET['id'];$query = "SELECT * FROM users WHERE id = $id";$result = mysqli_query($conn, $query);?>Sicherer Code (Verwendung vorbereiteter Abfragen):
<?php$stmt = $conn->prepare("SELECT * FROM users WHERE id = ?");$stmt->bind_param("i", $_GET['id']);$stmt->execute();$result = $stmt->get_result();?>Empfehlungen:
- Verwenden Sie immer vorbereitete Anweisungen (PDO oder MySQLi).
- Verknüpfen Sie niemals Benutzerdaten in SQL-Abfragen.
- Validieren Sie Datentypen (z. B.
is_numeric()für IDs).
2. XSS (Cross-Site Scripting)
Einschleusen von JavaScript-Code auf die Seite durch ungeprüfte Daten. Diebstahl von Cookies, Weiterleitung auf Phishing-Seiten.
Gefährlicher Code:
<?phpecho "Hallo, " . $_GET['name'];?>Sicherer Code:
<?phpecho "Hallo, " . htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8');?>Empfehlungen:
- Maskieren Sie die Ausgabe mit
htmlspecialchars(). - Setzen Sie Content-Security-Policy (CSP) in den Headern.
- Verwenden Sie für JSON-Antworten
json_encode().
3. CSRF (Cross-Site Request Forgery)
Der Angreifer zwingt einen authentifizierten Benutzer, eine unerwünschte Aktion auszuführen (z. B. Geldüberweisung).
Beispiel eines Formulars ohne Schutz:
<form action="delete.php" method="POST"> <input type="hidden" name="id" value="123"> <input type="submit" value="Löschen"></form>Sicherer Code (mit Token):
<?phpsession_start();if (empty($_SESSION['token'])) { $_SESSION['token'] = bin2hex(random_bytes(32));}?><form action="delete.php" method="POST"> <input type="hidden" name="token" value="<?= $_SESSION['token'] ?>"> <input type="hidden" name="id" value="123"> <input type="submit" value="Löschen"></form>Empfehlungen:
- Generieren Sie eindeutige CSRF-Token für jedes Formular.
- Überprüfen Sie Token auf dem Server, bevor Sie Aktionen ausführen.
- Verwenden Sie SameSite-Cookies (Lax oder Strict).
4. Fehlerhafte Authentifizierung und Sitzungsverwaltung
Schwacher Sitzungsschutz, Identifikator-Leck, Session Fixation.
Verwundbarer Code:
<?phpsession_start();if ($_POST['password'] == 'admin123') { $_SESSION['logged'] = true;}?>Sicherer Code:
<?phpsession_start();session_regenerate_id(true); // Sitzungs-ID nach Login ändern
// Passwort-Hashing$hash = password_hash($_POST['password'], PASSWORD_BCRYPT);if (password_verify($input_password, $hash)) { $_SESSION['logged'] = true; $_SESSION['user_agent'] = $_SERVER['HTTP_USER_AGENT'];}?>Empfehlungen:
- Verwenden Sie
password_hash()undpassword_verify(). - Regenerieren Sie die Sitzungs-ID nach dem Login.
- Überprüfen Sie den User-Agent und die IP-Adresse (optional).