Sicherheit von PHP-Anwendungen: Top-10-Schwachstellen für Anfänger
\nPHP bleibt eine der beliebtesten Sprachen für die Webentwicklung, aber seine Flexibilität führt oft zu Schwachstellen, wenn grundlegende Sicherheitsregeln nicht beachtet werden. Laut OWASP sind die meisten Hacks auf 10 typische Fehler zurückzuführen, die Anfänger-Entwickler machen. In diesem Artikel analysieren wir jede Schwachstelle mit realen Codebeispielen und zeigen, wie Sie Ihre Anwendung schützen können.
\n\n1. SQL-Injection
\nDer häufigste Angriff. Der Angreifer injiziert bösartigen SQL-Code über Benutzereingaben.
\nAngreifbarer Code:
\n<?php\n$id = $_GET['id'];\n$query = "SELECT * FROM users WHERE id = $id";\n$result = mysqli_query($conn, $query);\n?>\nSchutz: Verwenden Sie vorbereitete Anweisungen (prepared statements):
\n<?php\n$stmt = $conn->prepare("SELECT * FROM users WHERE id = ?");\n$stmt->bind_param("i", $_GET['id']);\n$stmt->execute();\n$result = $stmt->get_result();\n?>\n\n2. XSS (Cross-Site Scripting)
\nEinschleusen von JavaScript-Code auf die Seite durch ungeprüfte Daten.
\nAngreifbarer Code:
\n<?php\necho "Hallo, " . $_GET['name'];\n?>\nSchutz: Maskieren Sie die Ausgabe mit htmlspecialchars():
<?php\necho "Hallo, " . htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8');\n?>\n\n3. CSRF (Cross-Site Request Forgery)
\nEin Angriff, bei dem der Benutzer ungewollte Aktionen in seinem Namen ausführt.
\nAngreifbarer Code:
\n<form action="/delete.php" method="POST">\n <input type="submit" value="Konto löschen">\n</form>\nSchutz: Fügen Sie ein CSRF-Token hinzu:
\n<?php\nsession_start();\n$_SESSION['csrf_token'] = bin2hex(random_bytes(32));\n?>\n<form action="/delete.php" method="POST">\n <input type="hidden" name="csrf_token" value="<?= $_SESSION['csrf_token'] ?>">\n <input type="submit" value="Konto löschen">\n</form>\n\n4. Unsichere Passwortspeicherung
\nSpeicherung von Passwörtern im Klartext oder mit veralteten Hashes (MD5, SHA1).
\nAngreifbarer Code:
\n<?php\n$password = md5($_POST['password']);\n// oder\n$password = sha1($_POST['password']);\n?>\nSchutz: Verwenden Sie password_hash() und password_verify():
<?php\n$hash = password_hash($_POST['password'], PASSWORD_BCRYPT);\n// Überprüfung:\nif (password_verify($input_password, $hash)) {\n echo "Passwort korrekt";\n}\n?>\n\n5. Unsichere Dateiarbeit (Local/Remote File Inclusion)
\nEinbinden von Dateien über Benutzereingaben ohne Prüfung.
\nAngreifbarer Code:
\n<?php\ninclude($_GET['page'] . '.php');\n?>\nSchutz: Verwenden Sie eine Whitelist erlaubter Dateien:
\n<?php\n$allowed_pages = ['home', 'about', 'contact'];\n$page = $_GET['page'] ?? 'home';\nif (in_array($page, $allowed_pages)) {\n include($page . '.php');\n} else {\n include('404.php');\n}\n?>\n\n6. Falsche Sitzungskonfiguration
\nVerwendung vorhersagbarer Sitzungs-IDs oder fehlende Regenerierung.
\nAngreifbarer Code:
\n<?php\nsession_start();\n$_SESSION['user_id'] = $user_id;\n// Sitzung wird nach dem Login nicht regeneriert\n?>\nSchutz:
\n<?php\nsession_start();\nsession_regenerate_id(true); // ID-Regenerierung nach dem Login\n$_SESSION['user_id'] = $user_id;\n?>\n\n7. Unzureichende Eingabevalidierung
\nVertrauen in beliebige Benutzerdaten.
\nAn