SQL-Injection und parametrisierte Abfragen
Beseitigen Sie Injection-Risiken, indem Sie mit PDO stets vorbereitete Anweisungen verwenden.
SQL-Injection und parametrisierte Abfragen ist eine kostenlose PHP Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des PHP Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der PHP Academy-Kurs umfasst insgesamt 4 Lektionen.
Was ist SQL-Injection?
SQL-Injection tritt auf, wenn von Benutzern bereitgestellte Daten direkt in eine SQL-Abfrage eingebettet werden. Dadurch können Angreifer die Abfrage manipulieren, um Daten abzurufen, zu ändern oder zu löschen.
Klassisches Beispiel
Benutzereingaben werden an SQL angehängt:
<?php
// VULNERABLE: attacker enters username = "' OR '1'='1"
$sql = "SELECT * FROM users WHERE username = '".$_GET["username"]."'";
// Becomes: SELECT * FROM users WHERE username = '' OR '1'='1'
// Returns ALL users!Beispiel für Datenexfiltration
Ein Angreifer verwendet UNION SELECT, um Daten aus anderen Tabellen auszulesen.
// Input: ' UNION SELECT username, password FROM admin_users--
// This appends a second SELECT returning admin credentialsPrepared Statements sind die Lösung
Bei Prepared Statements steht die Struktur der Abfrage fest, bevor Daten übergeben werden. Die Datenbank behandelt alle gebundenen Werte als Literaldaten – niemals als SQL-Code.
<?php
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
$stmt->execute([$_GET["username"]]);
// Safe even if username = "' OR 1=1--"Benannte Platzhalter
Benannte Platzhalter sind übersichtlicher, insbesondere bei mehreren Parametern.
<?php
$stmt = $pdo->prepare(
"SELECT * FROM users WHERE email = :email AND active = :active"
);
$stmt->execute([":email" => $email, ":active" => true]);Eloquent ist standardmäßig sicher
Laravel Eloquent verwendet intern für alle standardmäßigen Query-Builder-Operationen vorbereitete PDO-Statements.
<?php
// Safe:
User::where("email", $email)->first();
// UNSAFE: raw query with user input!
DB::select("SELECT * FROM users WHERE email = ".$email);Raw Queries
Wenn Sie in Laravel Raw SQL verwenden müssen, nutzen Sie immer Parameterbindungen.
<?php
// Safe raw query:
$users = DB::select("SELECT * FROM users WHERE email = ?", [$email]);
// Or with named bindings:
$users = DB::select("SELECT * FROM users WHERE email = :email", [":email" => $email]);Injection in LIKE-Klauseln
LIKE-Klauseln erfordern eine besondere Behandlung: Platzhalterzeichen (%, _) müssen vor dem Binden manuell maskiert werden.
<?php
$search = str_replace(["%", "_", "\\"], ["\%", "\_", "\\\\"], $userInput);
$stmt = $pdo->prepare("SELECT * FROM products WHERE name LIKE ?");
$stmt->execute(["%$search%"]);Injection in ORDER BY
Spaltennamen und ORDER-BY-Richtungen können nicht parametrisiert werden. Validieren Sie sie anhand einer Whitelist.
<?php
$allowedColumns = ["name", "price", "created_at"];
$col = in_array($request->sort, $allowedColumns) ? $request->sort : "name";
$dir = $request->dir === "desc" ? "desc" : "asc";
// Then safely build the query stringGespeicherte Prozeduren
Auch gespeicherte Prozeduren können anfällig sein, wenn sie Eingaben intern zusammenfügen. Verwenden Sie für Aufrufe immer Parameter.
Prinzip der geringsten Berechtigung
Der von PHP verwendete Datenbankbenutzer sollte für notwendige Tabellen nur über SELECT-, INSERT-, UPDATE- und DELETE-Berechtigungen verfügen – niemals über CREATE-, DROP- oder Administratorrechte.
Zusammenfassung
Verwenden Sie IMMER Prepared Statements mit gebundenen Parametern. Hängen Sie niemals Benutzereingaben an SQL an. Validieren Sie ORDER BY und Spaltennamen anhand einer Whitelist. Verwenden Sie PDO mit deaktivierten emulierten Prepared Statements.
Kurztest
Wie schützen Sie sich korrekt vor SQL-Injection?
Häufig gestellte Fragen
Ist die Lektion „SQL-Injection und parametrisierte Abfragen“ kostenlos?
Ja — der vollständige Text von „SQL-Injection und parametrisierte Abfragen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des PHP Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der PHP Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „SQL-Injection und parametrisierte Abfragen“?
Beseitigen Sie Injection-Risiken, indem Sie mit PDO stets vorbereitete Anweisungen verwenden. Du übst PHP Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um PHP Academy zu starten?
Keine Vorkenntnisse erforderlich. PHP Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.
Wie lange dauert die Lektion „SQL-Injection und parametrisierte Abfragen“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser PHP Academy-Lektion Code schreiben und ausführen?
Ja. Jede PHP Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Cross-Site-Scripting (XSS) verhindern
- SQL-Injection und parametrisierte Abfragen
- CSRF-Schutz
- Passwörter sicher speichern