--- liste.php (vorher) +++ liste.php (nachher) @@ -3,21 +3,28 @@ require __DIR__ . '/lib.php'; -// Oeffentliche Nachrichten durchsuchen (Kundenseite, fehlerhaft). +// Oeffentliche Nachrichten durchsuchen. +// Behoben: SQL-Injection (Prepared Statement, LIKE-Zeichen maskiert) und XSS (htmlspecialchars an jeder Ausgabe). $q = $_GET['q'] ?? ''; +if (!is_string($q)) { + $q = ''; +} $pdo = db(); -$sql = "SELECT id, name, nachricht FROM nachrichten WHERE oeffentlich = 1 AND nachricht LIKE '%" . $q . "%' ORDER BY id"; -$zeilen = $pdo->query($sql)->fetchAll(); +$stmt = $pdo->prepare( + "SELECT id, name, nachricht FROM nachrichten WHERE oeffentlich = 1 AND nachricht LIKE :q ESCAPE '\\' ORDER BY id" +); +$stmt->execute([':q' => '%' . addcslashes($q, '%_\\') . '%']); +$zeilen = $stmt->fetchAll(); echo kopf('Nachrichten'); echo '
Suche nach: ' . $q . '
'; + echo 'Suche nach: ' . h($q) . '
'; } echo '