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

Linux súkromne i pracovne v2.0 (14. časť): Small Business Server

09.11.2016 14:57

Pojem Small Business Server (malý firemný server) začala používať spoločnosť Microsoft ešte v roku 2000 na označenie servera, ktorý ­dokázal plniť úlohy niekoľkých samostatných serverov. Aplikačná vrs ...

ITPro

Industry 4.0: Fikcia alebo už realita?

09.11.2016 14:52

Štvrtá priemyselná revolúcia je pomenovanie rozsiahlych zmien prudko vstupujúcich do súčasného priemyslu. Nositeľom týchto zmien je digitalizácia výroby a optimalizácia všetkých podnikových procesov v ...

ITPro

Vývoj aplikácií UWP pre Xbox One II.

09.11.2016 14:47

V predošlej časti sme ukázali postup, ako si ­vytvoriť vývojársky účet a aktivovať vývojársky režim na hernej konzole Xbox One, aby ste mohli testovať svoje aplikácie. Výhodou hernej konzoly Xbox je v ...

Žiadne komentáre

Vyhľadávanie

Kyocera - prve-zariadenia-formatu-a4-s-vykonom-a3

Najnovšie videá