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']);
// 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
));
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';