Zpět na seznam článků     Číst komentáře (16)     Verze pro tisk

Vložení do SQL

Autor: Studna   
9.1.2007

Článek pojednává o bezpečnosti SQL dotazů a zneužití těchto dotazů.


Vložení do SQL dotazu

Vložení do SQL neboli SQL injection.
SQL injection je jednou z nejnebezpečnějších chyb, kterých se můžou programátoř dopustit.

Představte si, že máte web.
Na něm publikujete články.
Adresa na nějaký článek vipadá třeba takto:
www.muj-web.cz/clanek.php?id=12

Soubor clanek.php
?php
$id = $_GET['id'];
............
$select = mysql_query("SELECT jmeno,text FROM clanky WHERE id=$id");
// Zkušenější programátoři již chybu vidí.
while($vvber = mysql_fetch_array($select)){
echo ..... $vyber[0] .... $vyber[1]; }
.........
?
Vše funguje tak jak má.
Ale co když se objeví někdo, kdo zavolá stránku:
www.muj-web.cz/clanek.php?id=0 OR 1=1
Jak bude SQL dotaz vipadat?
Takto:
SELECT jmeno,text FROM clanky WHERE id=0 OR 1=1
Tento dotaz vypíše všechny články z vašeho webu.
To většinou až zas tak nevdí, ale co se stane, pokud někdo zavolá stránku:
www.muj-web.cz/clanky.php?id=0 *NION SELECT nick,heslo FROM redaktori
Ne/vypíše to článek s ID 0, ale také to vypíše "článek", kde nadpis bude uživ. jméno redaktora a místo textu bude heslo.
Metoda přes *NION nejde použít, pokud můžete editovat dotaz až za příkazem ORDER BY.
Takže třeba:
www.muj-web.cz/vypis-clanku.php?seradit=ASC
Vypíše články vzestupně.
Ale odkaz:
www.muj-web.cz/vypis-clanku.php?seradit=ASC *NION SELECT nick,heslo FROM redaktori
Akorát nahlásí chybu, jělikož nejde používat *NION pokud doatz obsahuje ORDER BY...
Ukážeme si další příklad a dotaz trošičku poupravíme.
Dotaz na stránce vypis-clanku.php bude vipadat takto:
SELECT jmeno,text FROM clanky WHERE rubrika=$rub ORDER BY jmeno
$rub je získáná z _GET parametru.
Pokud by jsme použili URL z minulích příkladů, tak nám to nahlásí chybu a mi nic nezískáme.
Jělikož Příkaz obsahuje ORDER BY.
Proto jěště na konec příkazu, který vkládáme do URL vložíme: --
-- znamená v SQL jednořádková poznámka, takže co je za tim, tak se neprovede.
Takže budeme volat trochu jinou URL než jsme volali do ted.
Tady je:
www.muj-web.cz/vypis-clanku.php?rub=1 *NION SELECT nick,heslo FROM redaktori --
SQL dotaz bude vipadat takto:
SELECT jmeno,text FROM clanky WHERE rubrika=$rub *NION SELECT nick,heslo FROM redaktori -- ORDER BY jmeno
ORDER BY jmeno se bude počítat jako poznámka, takže nebude zasahovat do dotazu.

Ted si zodpovíme otázku.
Existue proti vložení do SQL obrana?
Odpověd je snadná.
Ano existuje.
A je následovná:
Pokud se jedná o číslo (např. id), tak stačí ověřit, jestly je to opravdu číslo.
A to takto:
if(int($id)){ dotaz atd. }

Dneska jsme se bavili pouze o číslech.
Příští článek bude zaměřen na validaci textu přes $_GET a $_POST.

Přidávám seznam celkem velkých webů, které padli touto metodou:
http://sw.cz
http://invia.cz
http://www.clnet.cz
http://bradavice.gobie.org
http://bazar.mall.cz
http://ewafarna.cz
http://ehry.net
http://owebu.cz
Ke všem mohu předložit důkazy.
A pak spousta malích webů.

Studna

Článek nesmí sloužit k nelegálním účelům!

Omluvte prosím pravopisné chyby.
*=U

Líbil se Vám článek?
Budeme potěšeni, pokud vás zaujme také reklamní nabídka

Social Bookmarking

     





Hodnocení/Hlasovalo: 0/0

1  2  3  4  5    
(známkování jako ve škole)