SQL injection – Ako sa brániť?

Mnohí weboví vývojári si nie sú vedomí toho, ako jednoducho je možné SQL dopyt manipulovať. Predpokladajú, že SQL požiadavka je dôveryhodná činnosť vykonávaná medzi SQL serverom a PHP serverom či iným serverom, ktorý zostavuje znenie SQL dopytu.

Čo to vlastne SQL dopyt je?

SQL (Structured Query Language alebo po slovensky Štruktúrovaný Vyhľadávací Jazyk) slúži ako komunikačný jazyk medzi klientskym rozhraním (web, aplikácia) a databázou. Vetu vzniknutú z jednotlivých príkazov tohto jazyka nazývame SQL dopyt. SQL dopyt často vzniká v klientskom rozhraní ale môže byť tiež automatizovaný pomocou SQL udalostí.

Čo to je SQL injection?

SQL injection je forma útoku, ktorú možno prirovnať k tomu, keď niekto niekoho prerušuje pri hovorení svojich myšlienok.

Klientske rozhranie (napr. neodborne naprogramovaná PHP aplikácia) zostavuje SQL dopyt pomocou odoslaných dát na server. Tento SQL dopyt by bol za normálnych okolností zaslaný databáze, ktorá ho spracuje a podľa toho vykoná potrebnú činnosť. Útočník však odhalí nechránený formulár alebo nechránenú časť PHP kódu. Využije tento formulár na vloženie svojho kódu do kódu, ktorý si pripravuje klientske rozhranie generujúce SQL dopyt. Keďže programátor klientskeho rozhrania nemyslel na bezpečnosť, je kód akceptovaný zo strany generátora a klientske rozhranie spracuje a odošle kód doplnený o kód útočníka. Útočník zisťuje, že jeho skúšobný SQL injection prešiel generátorom a hľadá SQL dopyt, ktorý mu otvorí cestu k administračnému rozhraniu webovej stránky. Keď útočník príde na to, ako zostaviť správny SQL injection, už mu nič nebude stáť v ceste k citlivým údajom. Dostane sa tak do administračného rozhrania, kde sa nachádzajú informácie ako emaily, adresy, telefónne čísla, bankové účty, heslá či rôzne iné dáta.

SQL injection je teda zistenie slabiny a odoslanie SQL dopytu ktorý má spôsobiť neprirodzené chovanie systému. To bol jeden z miliónov možných scenárov, ktoré sa môžu odohrať aj na vašom webe, ak nebude chránený proti SQL injection. Ochrana je pritom jednoduchá.

Ako sa chrániť?

Cieľom ochrany je minimalizovať možnosti útočníka. Každá webová stránka by mala dodržiavať tri základné pravidlá ochrany:

  • • Prevencia proti SQL útokom na strane klienta
  • • Prevencia proti SQL útokom na strane servera
  • • Sledovanie podozrivého správania

Preventívna ochrana znemožní odoslať klientovi obsah, ktorý môže na serveri spôsobiť nežiadúce chovanie. HTML5 umožňuje ošetriť formulár regulárnymi výrazmi, ktoré nedovolia vložiť iný obsah ako očakávaný. V každom prípade nezabudnite na rovnakú ochranu pomocou JavaScriptu. Keďže ochrana pomocou HTML5 a JavaScriptu na strane klienta môže len ťažko odradiť útočníkov, môžete im pristrihnúť krídla pomocou skriptu na serveri, ktorý zabezpečí, že požiadavka odoslaná ako:

1: “stlpec“>0

Bude spracovaná ako:

1: stlpec0

V PHP by takáto úprava znela nasledovne:

1: $filter = $_POST['my_post'];
2: $foo = array('<','>','=','!','_',';','{','}','(',')','“');
3: $filter = str_ireplace($foo,'',$filter);

Tento jednoduchý kód vylúči preddefinované znaky z reťazca. Potom už stačí používať premennú $filter namiesto priameho načítania z POST či GET. Môžeme tiež využiť pokročilejšie spôsoby ochrany, napríklad pomocou regulárnych výrazov, ktoré budú overovať, či je SQL dopyt validný - či môže byť spracovaný. Sledovanie podozrivého správania je pokročilá metóda sledovania používateľov webovej stránky bez narušovania ich súkromia. V prípade, že používateľ začne vykonávať neočakávanú činnosť, stránka vypíše chybu 404 alebo iným spôsobom zastaví činnosť používateľa.

Množstvo programátorov a vlastníkov stránok sa domnieva, že bezpečnosť sa ich netýka a že pre útočníkov nebudú zaujímaví. Keď dôjde k útoku, za únik nechránených údajov zodpovedá majiteľ stránky a ten kto stránku programoval. Nikdy preto nepoužívajte systémy do ktorých môže útočník vidieť. Jedná sa o voľne dostupné systémy, ktoré nie sú jedinečné a ich zdrojový kód si môže útočník stiahnuť a nájsť slabiny.

Späť...