Wissen / Cheatsheets / Webentwicklung
PHP Security Cheatsheet: PDO, XSS und CSRF
Sichere Standardmuster für typische PHP-Webanwendungen.
Dieser Leitfaden führt dich vom konkreten Ausgangsproblem über die praktische Umsetzung bis zur überprüfbaren Abnahme. Jeder Abschnitt nennt eine Methode, ein Beispiel, ein Erfolgskriterium und eine typische Fehlerquelle.
Arbeitsablauf auf einen Blick
1. SQL-Injection verhindern
Nutze PDO mit Prepared Statements und parametrierten Werten; SQL-Bezeichner nicht ungeprüft übernehmen.
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id"); $stmt->execute(["id" => $id]);
2. XSS vermeiden
Escape dynamische HTML-Ausgaben kontextgerecht; für HTML-Text htmlspecialchars mit ENT_QUOTES und UTF-8.
echo htmlspecialchars($name, ENT_QUOTES | ENT_SUBSTITUTE, "UTF-8");
3. CSRF-Schutz
Nutze zufällige Session-Tokens für zustandsändernde Formulare und prüfe sie mit hash_equals.
if (!hash_equals($_SESSION["csrf"], $_POST["csrf"] ?? "")) { http_response_code(403); exit; }
4. Sitzungen absichern
Aktiviere Secure/HttpOnly/SameSite, erneuere Session-ID nach Login und setze angemessene Timeouts.
session_regenerate_id(true);
5. Uploads validieren
Prüfe Größe, MIME-Typ serverseitig und Dateiinhalte; speichere mit zufälligem Namen außerhalb ausführbarer Pfade.
finfo_file() und random_bytes() für Dateinamen.
Abnahmeprotokoll für die Praxis
Nutze die folgenden Punkte als dokumentierbare Abnahme. Trage bei jedem Punkt Datum, getestete URL beziehungsweise System, Ergebnis und gegebenenfalls einen offenen Befund ein.
Abnahmekriterium: Sonderzeichen im Parameter verändern nicht die Abfrage.
Abnahmekriterium: Eingegebene Tags werden als Text angezeigt.
Abnahmekriterium: Formular ohne gültigen Token wird abgewiesen.
Abnahmekriterium: Nach Login ist die Session-ID gewechselt und Cookies sind passend markiert.
Abnahmekriterium: Hochgeladene Dateien sind nicht als PHP ausführbar.
Fachquellen und weiterführende Dokumentation
Diese Primärquellen dienen zur Vertiefung und zur Prüfung versionsabhängiger Details. Bei rechtlichen Themen ersetzt der Leitfaden keine individuelle Rechtsberatung.
Praxisvertiefung: Sichere Ein- und Ausgabe konsequent trennen
Nutze Prepared Statements für SQL, HTML-Escaping für Ausgaben, CSRF-Tokens für zustandsändernde Formulare und serverseitige Berechtigungsprüfungen.
Technische Umsetzung
PDO-Beispiel: $stmt=$pdo->prepare("SELECT * FROM users WHERE id = :id"); $stmt->execute(["id"=>$id]); Für HTML: htmlspecialchars($value, ENT_QUOTES | ENT_SUBSTITUTE, "UTF-8").
So überprüfst du das Ergebnis
Teste SQL-Sonderzeichen, HTML-Payloads, fehlende CSRF-Tokens und unberechtigte Zugriffe. Prepared Statements ersetzen keine Autorisierung.