Sicherheit von PHP-Anwendungen: Die Top-10 Schwachstellen in der Praxis
PHP bleibt eine der beliebtesten Sprachen für die Webentwicklung, aber seine Flexibilität führt oft zu ernsthaften Sicherheitsproblemen. Laut OWASP stehen 80% der Angriffe auf Webanwendungen im Zusammenhang mit Schwachstellen, die bereits in der Codierungsphase verhindert werden können. In diesem Artikel analysieren wir die 10 häufigsten Schwachstellen von PHP-Anwendungen mit realen Codebeispielen und Schutzmethoden. Das Material ist sowohl für Anfänger als auch für erfahrene Entwickler nützlich.
1. SQL-Injection
Die gefährlichste und häufigste Schwachstelle. Der Angreifer gibt SQL-Code über Eingabefelder ein und erhält so Zugriff auf die Datenbank.
Verwundbarer Code:
$username = $_POST['username'];$query = "SELECT * FROM users WHERE username = '$username'";Angriff: Die Eingabe ' OR '1'='1 verwandelt die Abfrage in SELECT * FROM users WHERE username = '' OR '1'='1' und gibt alle Benutzer zurück.
Schutz: Verwenden Sie vorbereitete Anweisungen (prepared statements) mit PDO:
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username");$stmt->execute(['username' => $_POST['username']]);2. XSS (Cross-Site Scripting)
Der Angreifer injiziert JavaScript-Code, der im Browser des Opfers ausgeführt wird. Es gibt drei Typen: reflected, stored und DOM-based.
Verwundbarer Code (stored XSS):
echo "<div>" . $comment . "</div>";Schutz: Escapen Sie die Ausgabe mit htmlspecialchars():
echo "<div>" . htmlspecialchars($comment, ENT_QUOTES, 'UTF-8') . "</div>";Für HTML-Inhalte verwenden Sie Bibliotheken wie HTML Purifier.
3. CSRF (Cross-Site Request Forgery)
Der Angriff zwingt einen autorisierten Benutzer, eine unerwünschte Aktion auf der Website auszuführen, z. B. eine Passwortänderung oder eine Überweisung.
Schutz: Implementieren Sie CSRF-Token:
// Token-Generierung$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
// Im Formularecho '<input type="hidden" name="csrf_token" value="' . $_SESSION['csrf_token'] . '">';
// Überprüfungif ($_POST['csrf_token'] !== $_SESSION['csrf_token']) { die('CSRF-Angriff erkannt');}4. Path Traversal (Verzeichnisdurchquerung)
Der Angreifer manipuliert Dateipfade, um Zugriff auf Systemdateien (/etc/passwd usw.) zu erhalten.
Verwundbarer Code:
$file = $_GET['file'];include("pages/" . $file);Schutz: Verwenden Sie Whitelists oder die Funktion basename():
$allowed = ['home', 'about', 'contact'];$file = basename($_GET['file']);if (in_array($file, $allowed)) { include("pages/$file.php");} else { die('Ungültige Datei');}5. File Upload Vulnerabilities (Schwachstellen beim Datei-Upload)
Der Angreifer lädt ein PHP-Skript anstelle eines Bildes hoch und erhält so Fernzugriff auf den Server.
Schutz:
- Überprüfen Sie den MIME-Typ der Datei:
$_FILES['file']['type'] - Verwenden Sie
finfozur Bestimmung des tatsächlichen Typs - Verbieten Sie die Ausführung von Skripten im Upload-Ordner über
.htaccess - Generieren Sie eindeutige Dateinamen:
md5(uniqid()) . '.jpg'
$finfo = finfo_open(FILEINFO_MIME_TYPE);$mime = finfo_file($finfo, $_FILES['file']['tmp_name']);$allowed = ['image/jpeg', 'image/png'];if (!in_array($mime, $allowed)) { die('Ungültiger Dateityp');}6. Session Fixation (Sitzungsfixierung)
Der Angreifer zwingt dem Benutzer eine bekannte Sitzungs-ID auf, um diese nach der Anmeldung zu übernehmen.
Schutz: Nach erfolgreicher