5. března 2025

Hrozba jménem SQL injection: co to je a jak se bránit?

Vít Kubát

Vít Kubát

Software Engineer

Co je SQL injection a jak se bránit?

Co je SQL?

SQL je jazyk používaný pro práci s databázemi – umožňuje čtení, vkládání, aktualizaci nebo mazání dat. Většina moderních webových aplikací využívá relační databáze založené na SQL. Webové formuláře často posílají uživatelská data přímo do databázových dotazů bez dostatečné kontroly jejich obsahu. Útočníci toho využívají k vložení škodlivých příkazů.

Co to je SQL injection?

SQL injection (SQLi) je typ kybernetického útoku, při kterém útočník vloží škodlivý SQL kód do vstupních polí aplikace s cílem manipulovat databázi a získat přístup k citlivým informacím. Jedná se o jednu z nejstarších a nejrozšířenějších zranitelností webových aplikací, která byla poprvé popsána již koncem 90. let minulého století.

Možné dopady SQL injection:

  • Únik citlivých dat (hesla, osobní údaje)
  • Manipulace nebo smazání dat
  • Převzetí kontroly nad databází
  • Změna oprávnění uživatelů
  • Kompromitace celého systému

Jak SQL injection funguje?

Typický scénář SQL injection útoku spočívá v tom, že útočník využije vstupní pole webové aplikace (například formulář pro přihlášení) k zadání speciálně vytvořeného řetězce obsahujícího SQL příkazy. Pokud aplikace neprovádí dostatečnou kontrolu vstupů, může dojít k interpretaci tohoto řetězce jako legitimního SQL dotazu.

Například při přihlášení může útočník zadat místo hesla následující řetězec:

' OR 1=1 --

Pokud aplikace tento vstup neošetří, databáze jej interpretuje jako platný SQL příkaz a umožní útočníkovi přístup bez znalosti skutečného hesla.

SELECT * FROM users WHERE username = 'admin' AND password = 'password' OR '1'='1';

V tomto případě výraz '1'='1' vždy vrátí pravdu, což způsobí obejití autentizace a umožní přístup k účtu bez znalosti skutečných údajů.

Typy SQL injection

Existuje několik základních typů SQL injection:

  • Klasická SQL injection
  • Blind SQL injection
  • Union-based injection
  • Error-based injection
  • Time-based injection

Jak se bránit proti SQL injection?

Naštěstí existují osvědčené postupy a techniky, které mohou vývojářům pomoci minimalizovat riziko útoků typu SQL Injection.

  1. Parametrizované dotazy oddělují uživatelský vstup od samotného SQL příkazu. Díky tomu databáze interpretuje vstupy pouze jako data a nikoli jako spustitelné příkazy.

Příklad v jazyce Java:

String query = "SELECT * FROM users WHERE username = ? AND password = ?";
PreparedStatement statement = connection.prepareStatement(query);
statement.setString(1, username);
statement.setString(2, password);

Tento přístup je považován za jednu z nejúčinnějších ochran před SQLi útoky.

  1. Sanitizace a validace vstupů

Každý uživatelský vstup musí být důkladně kontrolován a sanitizován. To zahrnuje odstranění speciálních znaků (', ", --) nebo jejich nahrazení bezpečnými alternativami. Dále je vhodné používat whitelisty povolených znaků namísto blacklistů.

Pokud například očekáváme telefonní číslo, povolíme pouze číslice a případně specifické znaky (+,-). Jakékoli jiné znaky budou automaticky odstraněny.

  1. Omezení práv uživatelů databáze

Princip nejnižších oprávnění (least privilege) znamená poskytování pouze nezbytných práv jednotlivým uživatelům či rolím aplikací. Omezení práv minimalizuje dopad případného útoku – i když se útočníkovi podaří proniknout do databáze, nebude schopen provádět operace mimo své omezené pravomoci.

  1. Aktualizace softwaru a pravidelné záplatování

Pravidelné aktualizace softwaru jsou klíčové pro prevenci bezpečnostních chyb včetně SQLi. Starší verze softwaru mohou obsahovat známé zranitelnosti, které lze snadno zneužít.

  1. Používání Web Application Firewall (WAF)

Web Application Firewall (WAF) dokáže detekovat a blokovat škodlivé požadavky na základě pravidelně aktualizovaných signatur známých útoků. WAF tedy představuje další vrstvu ochrany proti pokusům o SQL injection.

  1. Monitorování provozu

Monitorování aktivity na webových aplikacích umožňuje rychlou detekci podezřelých aktivit (např. neobvyklého počtu dotazů nebo neúspěšných pokusů o přihlášení). Včasná detekce je zásadní pro minimalizaci škod způsobených útokem

  1. Omezení použití uložených procedur

Uložené procedury mohou být také náchylné na injektáž škodlivého kódu, pokud nejsou správně zabezpečeny. Proto je nutné dbát zvýšené opatrnosti při jejich implementaci a používání.

  1. Školení zaměstnanců

Vzdělávání zaměstnanců o rizicích spojených s SQLi a správných metodách prevence je klíčovou součástí celkové strategie ochrany před kybernetickými hrozbami.

Nástroje pro detekci zranitelností

Existují specializované nástroje jako například SQLMap, které umožňují automatickou detekci potenciálních slabin vůči útokům typu SQL injection. Tyto nástroje testují webové aplikace na známé slabiny a pomáhají vývojářům rychle identifikovat problematická místa v kódu.

Metoda ochrany Popis
Parametrizované dotazy Oddělení dat od příkazů
Sanitizace vstupů Odstranění nebezpečných znaků
Omezení práv Nejnižší možná oprávnění
Aktualizace softwaru Pravidelné záplatování
Web Application Firewall Blokování škodlivých požadavků
Monitorování aktivity Detekce podezřelého chování

Závěr

SQL Injection patří mezi nejstarší a stále aktuální hrozby kybernetické bezpečnosti. Díky správným preventivním opatřením lze však riziko výrazně snížit či úplně eliminovat. Kombinací parametrizovaných dotazů, důslednou sanitací vstupních dat, omezením oprávnění uživatelů databází a průběžným monitorováním lze efektivně chránit webové aplikace před tímto typem útoku.

Naše zdroje

FreeCodeCamp, Kaspersky, Cloudflare

Připraveni začít?

Kontaktujte nás a společně najdeme nejlepší řešení pro váš projekt. První konzultace je zdarma.