Hlavní navigace

Názor k článku Zranitelnosti typu injekce: SQL injekce od Pavel Stěhule - Prepared statements - předpřipravené dotazy - je technologie,...

  • Článek je starý, nové názory již nelze přidávat.
  • 12. 10. 2018 13:47

    Pavel Stěhule

    Prepared statements - předpřipravené dotazy - je technologie, která původně umožňovala (a umožňuje dodnes) redukovat režii optimalizátoru. SQL příkaz si můžete představit jako zdrojový kód programu ze kterého se generuje strojový kód. Je tam celá řada optimalizací - kde se mají použít indexy, v jakém pořadí se mají spojovat relace, jaké se mají použít algoritmy pro spojování relací, agregaci, .. Výsledkem práce kompilátoru je strojový kód - výsledkem práce SQL optimalizátoru je prováděcí plán dotazu.

    U komerčních databází se implicitně ukládá do plan cache. U open source databází se po vykonání zahazuje. Opakované použití plánu si lze vynutit vytvořením tzv předpřipraveného dotazu (PREPARE) - kdy se prováděcí plán pojmenuje a uloží do plan cache. Speciálním příkazem (EXECUTE) se dohledá plán v plan cache a nechá se vykonat. Poté, co se objevil problém SQL injection se ukázalo, že PS jsou principiálně imunní vůči těmto útokům.

    Jelikož PP používají komplikovanější protokol, jehož použití může být pro dotazy, které se neopakují neefektivní, přišlo JDBC s tzv. client side PP. API je pro vývojáře stejné, implementace úplně jiná - dotaz je rozparsovaný na klientské strane, a před vlastním voláním JDBC znovu sestaví dotaz a parametry nahradí oescapeovanými hodnotami. Dotaz se pak vykoná klasicky. Např. Postgres JDBC prvních 5 iterací dotazu řeší na klientské straně, a až pro 6 iteraci se vytvoří server side PS.

    Uložené procedury je kód, který se spouští na serveru z "user space". Dost často se může jednat o kód, který obsahuje SQL příkazy, a pokud se použije nativní jazyk pro uložené procedury - PLpgSQL, PL/SQL, SQL/PL - tak pro embedované SQL příkazy jsou automaticky vytvořené PS.