Školník má klíče od všech místností. Učitel jen od svého kabinetu a tříd, žák od své skříňky. Nikdo nemá víc klíčů, než potřebuje. Když žák klíč ztratí, zloděj se nedostane do ředitelny.
Databáze funguje stejně. Obsahuje známky, adresy, rodná čísla, hesla. Každý uživatel smí jen to, co nutně potřebuje. Tady se naučíš, jak se oprávnění nastavují a jak data chránit.
ucitel pro aplikaci žákovské knížky.SELECT) tabulku znamky.GRANT (přiděl oprávnění) a REVOKE (odeber oprávnění).GRANT SELECT ON znamky TO zak;ucitele: čtení a zápis známek.GRANT SELECT ON znamky TO zak;GRANT SELECT, INSERT, UPDATE ON znamky TO ucitel;REVOKE UPDATE ON znamky FROM ucitel;Žák smí známky jen číst. Učitel je smí číst, vkládat a měnit. Poslední příkaz učiteli právo měnit zase odebere. (Přesný zápis jména uživatele se mezi SŘBD liší, třeba v MySQL 'ucitel'@'localhost'.)
| Opatření | Proti čemu chrání |
|---|---|
| oprávnění a role | neoprávněnému čtení a změnám |
| hesla ukládat jen jako hash (Argon2, bcrypt), nikdy čitelně | úniku hesel při krádeži databáze |
| šifrované spojení (TLS) a šifrování disku | odposlechu a krádeži nosiče |
| pravidelné zálohy a jejich zkušební obnova | ztrátě dat (havárie, chyba, ransomware) |
| protokolování (logy) přístupů | nevysledovatelnému zneužití |
Databáze s osobními údaji (jména, adresy, známky žáků) spadají pod GDPR, nařízení EU 2016/679. Správce musí údaje chránit a zpracovávat jen v nutném rozsahu.
root se všemi právy. Co je špatně?SELECT, INSERT, UPDATE (a případně DELETE) na své tabulky.Když někdo omylem smaže tabulku nebo data zašifruje ransomware, RAID tu změnu okamžitě provede na obou discích.
GRANT přiděluje, REVOKE odebírá oprávnění, role je seskupují. Platí princip nejmenších oprávnění. Hesla ukládej jako hash, dělej zálohy a chraň osobní údaje podle GDPR.Na přihlašovací stránce napíše útočník do pole heslo podivný text s apostrofy. A je přihlášený, aniž by heslo znal. Tomuto útoku se říká SQL injection (vložení SQL kódu). Patří dlouhodobě k nejčastějším zranitelnostem webových aplikací.
Pochopíš, jak útok funguje, a naučíš se jedinou spolehlivou obranu. Každý programátor, který pracuje s databází, ji musí znát.
SELECT * FROM uzivatele WHERE jmeno = 'eva';. Text v něm je v apostrofech.Aplikace dotaz sestaví a pošle SŘBD.' OR '1'='1.? nebo %s) místo hodnot. Hodnoty se pošlou zvlášť a SŘBD je vždy bere jen jako data, nikdy jako kód.WHERE jmeno = ? AND heslo_hash = ?Aplikace v Pythonu skládá dotaz spojováním řetězců:
dotaz = "SELECT * FROM uzivatele WHERE jmeno = '" + jmeno + "' AND heslo = '" + heslo + "'"eva a heslo tajne. Dotaz: … WHERE jmeno = 'eva' AND heslo = 'tajne'. Vše v pořádku.eva a heslo ' OR '1'='1.… WHERE jmeno = 'eva' AND heslo = '' OR '1'='1'.AND má přednost před OR. Podmínka zní: (jméno eva a prázdné heslo) nebo 1 = 1. Druhá část platí vždy.cur.execute( "SELECT * FROM uzivatele WHERE jmeno = ? AND heslo_hash = ?", (jmeno, heslo_hash))Hodnoty jdou do SŘBD odděleně od textu dotazu. Útočníkův vstup ' OR '1'='1 se pak hledá jako obyčejný (divný) text a nic se nestane. Navíc se tu neporovnává heslo, ale jeho hash.
…/zbozi?id=15 a aplikace dělá "SELECT * FROM zbozi WHERE id = " + id. Co když útočník zadá id=15; DROP TABLE zbozi?DROP TABLE a tabulka zmizí. I když ne, útočník může přidat OR 1=1 a vypsat všechno. Obrana: parametr WHERE id = ? a kontrola, že id je celé číslo.id = 15 OR 1=1) a různé SŘBD a kódování mají různé triky. Filtrování je křehké. Spolehlivou obranou jsou parametrizované dotazy.Kontrolu v prohlížeči útočník snadno obejde, třeba tím, že pošle požadavek přímo bez prohlížeče.