Wissen / Cheatsheets / Webentwicklung

PHP Security Cheatsheet: PDO, XSS und CSRF

Sichere Standardmuster für typische PHP-Webanwendungen.

Stand: 27.10.2026 · Redaktion: Carl Thorns · Kostenlos und ohne Anmeldung

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.

Praxisbeispiel
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id"); $stmt->execute(["id" => $id]);
So erkennst du, dass es funktioniert: Sonderzeichen im Parameter verändern nicht die Abfrage.
Typischer Fehler: SQL durch Escaping oder Stringverkettung zusammenbauen.

2. XSS vermeiden

Escape dynamische HTML-Ausgaben kontextgerecht; für HTML-Text htmlspecialchars mit ENT_QUOTES und UTF-8.

Praxisbeispiel
echo htmlspecialchars($name, ENT_QUOTES | ENT_SUBSTITUTE, "UTF-8");
So erkennst du, dass es funktioniert: Eingegebene Tags werden als Text angezeigt.
Typischer Fehler: HTML-Escaping für JavaScript- oder URL-Kontexte blind wiederverwenden.

3. CSRF-Schutz

Nutze zufällige Session-Tokens für zustandsändernde Formulare und prüfe sie mit hash_equals.

Praxisbeispiel
if (!hash_equals($_SESSION["csrf"], $_POST["csrf"] ?? "")) { http_response_code(403); exit; }
So erkennst du, dass es funktioniert: Formular ohne gültigen Token wird abgewiesen.
Typischer Fehler: Nur auf SameSite-Cookies als universellen Schutz vertrauen.

4. Sitzungen absichern

Aktiviere Secure/HttpOnly/SameSite, erneuere Session-ID nach Login und setze angemessene Timeouts.

Praxisbeispiel
session_regenerate_id(true);
So erkennst du, dass es funktioniert: Nach Login ist die Session-ID gewechselt und Cookies sind passend markiert.
Typischer Fehler: Session-IDs in URLs übertragen.

5. Uploads validieren

Prüfe Größe, MIME-Typ serverseitig und Dateiinhalte; speichere mit zufälligem Namen außerhalb ausführbarer Pfade.

Praxisbeispiel
finfo_file() und random_bytes() für Dateinamen.
So erkennst du, dass es funktioniert: Hochgeladene Dateien sind nicht als PHP ausführbar.
Typischer Fehler: Dateiendung oder Browser-MIME ungeprüft vertrauen.

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.

  1. Abnahmekriterium: Sonderzeichen im Parameter verändern nicht die Abfrage.

  2. Abnahmekriterium: Eingegebene Tags werden als Text angezeigt.

  3. Abnahmekriterium: Formular ohne gültigen Token wird abgewiesen.

  4. Abnahmekriterium: Nach Login ist die Session-ID gewechselt und Cookies sind passend markiert.

  5. 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.