Sicherheit von PHP-Anwendungen: Top-10 Schwachstellen und Schutzmethoden
PHP bleibt eine der beliebtesten Sprachen für die Webentwicklung, jedoch führt seine Flexibilität oft zu Schwachstellen. Laut Sicherheitsberichten weisen über 70 % der Webanwendungen mindestens eine kritische Schwachstelle auf. In diesem Artikel analysieren wir die Top-10 der gefährlichsten PHP-Schwachstellen, zeigen reale Codebeispiele und erläutern, wie Sie Ihre Anwendung effektiv schützen können.
1. SQL-Injection
Die häufigste und gefährlichste Schwachstelle. Ein Angreifer kann über Benutzereingaben beliebigen SQL-Code einschleusen.
Verwundbarer Code:
<?php$id = $_GET['id'];$query = "SELECT * FROM users WHERE id = $id";$result = mysqli_query($conn, $query);?>Schutz: Verwendung von Prepared Statements:
<?php$stmt = $conn->prepare("SELECT * FROM users WHERE id = ?");$stmt->bind_param("i", $_GET['id']);$stmt->execute();$result = $stmt->get_result();?>2. XSS (Cross-Site Scripting)
Einschleusen schädlicher Skripte in Webseiten. Es gibt drei Typen: Reflected, Stored und DOM-based.
Verwundbarer Code:
<?phpecho "Hallo, " . $_GET['name'];?>Schutz: Ausgabe escapen:
<?phpecho "Hallo, " . htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8');?>3. CSRF (Cross-Site Request Forgery)
Ein Angriff, bei dem ein Angreifer einen Benutzer dazu zwingt, unerwünschte Aktionen auf einer Website auszuführen, bei der dieser authentifiziert ist.
Schutz: Verwendung von CSRF-Tokens:
<?phpsession_start();if (empty($_SESSION['csrf_token'])) { $_SESSION['csrf_token'] = bin2hex(random_bytes(32));}
// Überprüfung beim Absenden des Formularsif ($_POST['csrf_token'] !== $_SESSION['csrf_token']) { die('CSRF-Angriff erkannt!');}?>
<form method="POST"> <input type="hidden" name="csrf_token" value="<?= $_SESSION['csrf_token'] ?>"> <button type="submit">Senden</button></form>4. Path Traversal
Eine Schwachstelle, die das Lesen beliebiger Dateien auf dem Server ermöglicht.
Verwundbarer Code:
<?php$file = $_GET['file'];include("pages/" . $file);?>Schutz: Validierung und Einschränkung von Pfaden:
<?php$allowed_files = ['about.php', 'contact.php', 'home.php'];$file = basename($_GET['file']);
if (in_array($file, $allowed_files)) { include("pages/" . $file);} else { die('Zugriff verweigert');}?>5. File Upload
Unsicherer Dateiupload kann zur Ausführung beliebigen Codes auf dem Server führen.
Schutz: Überprüfung von MIME-Typ und Dateierweiterung:
<?php$allowed_types = ['image/jpeg', 'image/png', 'image/gif'];$max_size = 5 * 1024 * 1024; // 5 MB
if ($_FILES['file']['size'] > $max_size) { die('Datei ist zu groß');}
$finfo = finfo_open(FILEINFO_MIME_TYPE);$mime_type = finfo_file($finfo, $_FILES['file']['tmp_name']);
if (!in_array($mime_type, $allowed_types)) { die('Ungültiger Dateityp');}
// Datei aus Sicherheitsgründen umbenennen$extension = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);$new_name = md5(uniqid()) . '.' . $extension;move_uploaded_file($_FILES['file']['tmp_name'], 'uploads/' . $new_name);?>6. Session Fixation
Ein Angriff, bei dem ein Angreifer dem Benutzer eine bekannte Session-ID aufzwingt.
Schutz: Regeneration der Session-ID:
<?phpsession_start();
// Nach erfolgreicher Authentifizierungi