14.10.2015 0 Comments

WWW hacking a obrana (5. časť)

V tejto časti sa pozrieme na to, ako sa brániť proti útokom typu SQL Injection. Zatiaľ však ešte neskončíme tému o formách útokov SQL Injection, ale spôsoby, ako zabezpečiť svoje aplikácie proti tomuto typu útokov, sú väčšinou tie isté. Celý problém spočíva len v neošetrení vstupu dát, ktoré sú následne ako súčasť príkazu SQL posielané na spracovanie do databázy.

Ako sa brániť proti SQL Injection?

Jedna z veľmi dôležitých vecí, na ktoré treba pamätať, je to, že k databázovému serveru sa netreba prihlasovať s najvyššími právami – ako používateľ root. Ak je to možné, používajte vždy čo najnižšie práva. My v ukážkových príkladoch používame používateľa root, ale v skutočnosti treba použiť na komunikáciu s databázami účet s čo najviac obmedzenými právami.

Ak tak urobíme, útočník nebude môcť mazať tabuľky alebo celé databázy, ako vám ukážeme v nasledujúcej časti seriálu.

Vždy preverujte každý vstup, ktorý ukladáte alebo posielate na nejaké spracovanie do databázy. Nezáleží na tom, či pochádza z prvku tzv. Select Box, kde sú už vopred definované hodnoty, pretože zmeniť ich nie je problém – či už pomocou lokálneho proxy servera, alebo uložením stránky na disk, prepísaním hodnoty v Select Boxe a spustením upravenej stránky namiesto pôvodnej.

Pri výstupe z databázy pre estetický vzhľad odstraňujte všetky spätné lomky napríklad funkciou stripslashes(reťazec). A naopak, pri vstupe dáta opäť „escapujeme“ napríklad funkciou mysqli_real_escape_string(pripojenie_na_datbazu, textovy_retazec).

Na overenie vstupu môžeme použiť napríklad funkcie is_numeric() alebo ctype_digit(), ktoré overia, či je zadaný parameter typu číslo.

1. spôsob zabezpečenia – spočíva v použití funkcie mysqli_real_escape_string()

Jednoduchý a účinný spôsob je vytvoriť nasledujúci kód a upraviť ho podľa potreby. Použijeme funkciu jazyka PHP s názvom mysqli_real_escape_string(pripojenie_na_databazu, neosetreny_retazec), ktorá je súčasťou jazyka PHP od verzie 5.0.

$pripojenie_na_databazu = mysqli_connect('localhost', 'root', '', 'zakaznici');

$meno_pouzivatela_OK =  mysqli_real_escape_string($pripojenie_na_databazu, $_GET['meno_pouzivatela']);

$heslo_pouzivatela_OK = mysqli_real_escape_string($pripojenie_na_databazu, $_GET['heslo_pouzivatela']);

$sql_p = "SELECT * FROM registrovani_pouzivatelia WHERE meno = '".$meno_pouzivatela_OK."' AND heslo = '".$heslo_pouzivatela_OK."'";

Uvedený kód ošetrí metaznaky, ktoré by mohli znamenať bezpečnostné riziko pre databázu SQL. Zabezpečuje to funkcia mysqli_real_escape_string(), ktorá je určená práve na ošetrenie vstupu do databázy SQL.
Pri pokuse o útok vložením reťazca Katka'/* by finálny príkaz SQL vyzeral takto:

Bez použitia funkcie mysqli_real_escape_string():
SELECT * FROM registrovani_pouzivatelia WHERE meno = 'Katka'/*' AND heslo=''

S použitím funkcie mysqli_real_escape_string():
SELECT * FROM registrovani_pouzivatelia WHERE meno = 'Katka\'/*' AND heslo=''


Tento spôsob ochrany pred útokmi SLQ Injection sa najviac odporúča, je jednoduchý a spoľahlivý.


2. spôsob zabezpečenia – ide o zdvojenie jednoduchých úvodzoviek

Nezabudnite však ošetriť každú premennú, ktorá ide do príkazu SQL, pretože existuje viac spôsobov, ktorými sa útočník môže pokúsiť prepašovať vhodný príkaz SQL.

$meno_pouzivatela_OK = str_replace("'", "''", $_GET['meno_pouzivatela']);

$heslo_pouzivatela_OK = str_replace("'", "''", $_GET['heslo_pouzivatela']);

Pretože keby programátor ošetril napríklad len premennú $meno_pouzivatela, mohol by útočník vložiť do poľa na heslo napríklad abc-hocijake_heslo' OR TRUE/*, následkom čoho by výsledný príkaz vyzeral takto:

SELECT * FROM registrovani_pouzivatelia WHERE meno = 'Katka' AND heslo='abc-hocijake_heslo' OR TRUE/*'

a útočník by sa opäť prihlásil bez problémov:

Vitajte používateľ lukas, Vaše heslo je c938489ddb8330955c187d62e032bb43
Vitajte používateľ Katka, Vaše heslo je katarina123


Použiť môžete aj funkciu addslashes(), ktorá pridá pred metaznaky ' a " spätnú lomku \.

$meno_pouzivatela_OK = addslashes($_GET['meno_pouzivatela']);

$heslo_pouzivatela_OK = addslashes($_GET['heslo_pouzivatela']);

Ak do políčka na meno vložíme Katka'/* a pole na heslo necháme prázdne, výsledok príkazu SQL bude vyzerať takto:

SELECT * FROM registrovani_pouzivatelia WHERE meno = 'Katka\'/*' AND heslo=''

a preto sa SQL Injection nepodarí.


Ďalšie spôsoby obrany pred SQL Injection sú odstraňovanie znakov, ktoré by mohli databáze spôsobiť problémy, alebo, naopak, povolenie len určitých znakov a-z, A-Z, 0-9. Treba však upozorniť používateľa na to, ktoré znaky sú povolené, aby sa zbytočne nepokúšal pri registrácii zadať do políčka na meno alebo heslo napríklad apostrof.

Zabezpečenie aplikácie pred SQL Injection nie je až také zložité. V podstate len vytvoríme funkcie, ktoré budú prijímať premenné tvoriace súčasť príkazu SQL, napríklad $meno_pouzivatela a $heslo_pouzivatela. Funkcie budú vracať ošetrený reťazec, ktorý môžeme bezpečne vložiť do príkazu pre databázu.

Záver
Zo všetkých spôsobov je najspoľahlivejšie asi escapovanie metaznakov, ktoré by v prípade, ak nie sú ošetrené, mohli spôsobiť injektovanie kódu do databázy SQL. Funkcia mysqli_real_escape_string() je štandard, ktorý sa na tento účel používa, a jej implementácia je jednoduchá. Nabudúce sa pozrieme na iné typy databáz, ako sú MS SQL a PostgreSQL.

 

 

Autor: Ján Chovanec

Nechajte si posielať prehľad najdôležitejších správ emailom

Mohlo by Vás zaujímať

ITPro 1

Rozšírená realita pomôže školám

17.12.2016 00:05

Raz vidieť je lepšie ako stokrát počuť a v školstve to platí ešte mnohonásobne viac. Čo však v prípade, ak si študenti majú pozrieť, ako v reálnom čase pracuje jadrový reaktor? Alebo by chceli vidieť, ...

ITPro

Linux súkromne i pracovne v2.0 (15. časť): SIP (Session Initiation Protocol)

13.12.2016 11:58

Je priam neuveriteľné, aké množstvo užitočných informácií a faktov súvisiacich s IP telefóniou (VoIP) sa skrýva za takou jednoduchou skratkou, ako je SIP. Nejde pritom iba o protokol, ale o mnoho ďalš ...

ITPro

Výzvy a perspektívy mobilných sietí

13.12.2016 11:52

Dostupnosť kvalitného mobilného pripojenia vrátane dostatočnej kapacity na prenos dát považujeme v súčasnosti za samozrejmosť.  O niektorých špecifikách a  perspektívach služieb mobilných operátorov v ...

Žiadne komentáre

Vyhľadávanie

ShowIT

Najnovšie videá