Zapytania parametryzowane (prepared statements) to sposób wysyłania zapytań do bazy danych, w którym treść polecenia SQL jest oddzielona od przekazywanych wartości. Baza traktuje dane jako wartości, a nie jako kod.
Jak działają zapytania parametryzowane?
Zapytanie zawiera znaczniki miejsc, na przykład WHERE id = ?, a wartości przekazuje się osobno. Nawet jeśli użytkownik wpisze fragment SQL, trafi on do zapytania jako zwykły tekst.
Przykład w PHP
W PDO: $stmt = $pdo->prepare('SELECT * FROM users WHERE email = ?'); $stmt->execute([$email]);. Zapytanie jest przygotowane raz, a wartość dołączana bezpiecznie.
Czy to wystarcza do ochrony?
To najskuteczniejsza ochrona przed SQL Injection, ale nie zastępuje walidacji danych ani ograniczania uprawnień konta bazy. Nazw tabel i kolumn nie da się przekazać parametrem, więc te należy wybierać z listy dozwolonych.
Typowe pułapki
Składanie zapytania przez łączenie tekstu i użycie parametrów tylko dla części wartości nadal zostawia lukę. Klauzule takie jak ORDER BY czy nazwy kolumn trzeba wybierać z listy dozwolonych. W PDO wyłącz emulację przygotowanych zapytań (PDO::ATTR_EMULATE_PREPARES), jeśli chcesz, aby przygotowanie odbywało się po stronie bazy. Tę samą zasadę stosuj w ORM-ach przy ręcznie pisanych fragmentach SQL.
Zobacz w praktyce
Jak zabezpieczyć aplikację przed SQL Injection
Wydajna komunikacja z bazą danych w popularnych CMS
Ochrona przed atakami brute force – jak zabezpieczam logowanie na stronie i serwerze