← Alle Guides
⚠ Web Application Security

SQL Injection beheben

SQL Injection entsteht, wenn User-Eingaben ohne Sanitisierung in SQL-Queries eingebaut werden. Ein Angreifer kann damit die gesamte Datenbank auslesen, aendern oder loeschen.
Risiko: Vollstaendiger Datenverlust, Datendiebstahl, Privilege Escalation, Remote Code Execution.

1. Prepared Statements verwenden (PHP/PDO)

NIEMALS User-Eingaben direkt in SQL einbauen:

// FALSCH (verwundbar):
$sql = "SELECT * FROM users WHERE id = " . $_GET['id'];

// RICHTIG (Prepared Statement):
$stmt = $pdo->prepare('SELECT * FROM users WHERE id = ?');
$stmt->execute([$_GET['id']]);
$user = $stmt->fetch();

// Oder mit Named Parameters:
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email AND status = :status');
$stmt->execute(['email' => $email, 'status' => 'active']);

2. ORM / Query Builder verwenden

// Laravel Eloquent:
$user = User::where('id', $request->input('id'))->first();

// Symfony Doctrine:
$user = $repository->findOneBy(['id' => $request->get('id')]);

// WordPress:
$results = $wpdb->get_results($wpdb->prepare(
    "SELECT * FROM wp_posts WHERE ID = %d", $id
));

3. Input Validation

Zusaetzlich zur Parametrisierung: Eingaben validieren.

// ID muss eine Zahl sein:
$id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);
if ($id === false) die('Ungueltige ID');

// Whitelist fuer erlaubte Werte:
$allowed = ['name', 'date', 'price'];
$sort = in_array($_GET['sort'] ?? '', $allowed) ? $_GET['sort'] : 'name';

Referenzen & weiterführende Links

OWASP SQL Injection Prevention PHP PDO Prepared Statements