Jak zabezpečit db proti SQLi?
Bere usr z URL adresy
PHP kod:
$usr=$_GET["usr"];
.
.
.
$usr = check($usr);
$res=mysql_query("SELECT `history` FROM `player` WHERE `name`= $usr LIMIT 1",$mysql);
Deklarace check():
function check($value) {
if (get_magic_quotes_gpc() )
$value = stripslashes($value);
if (!is_numeric($value) )
$value = "'".mysql_real_escape_string($value)."'";
return $value;
}
Výpis z sqli scanneru:
Keyword Found: [hr
Injection type is String (')
DB Server: MySQL >=5
Selected Column Count is 13
Valid String Column is 1
Current DB: XXX
Nadpis je snad jasný.
Pokud byste chtěli celý kód napište, děkuji za každou radu :)
Musis si osetrit napleni promenne $usr, pripadne vsech dalsich, ktere se v SQL dotazech uplatni.
Urcite bude v PHP existovat funkce, ktera zdvoji uvozovky, naúpr. QuoteStr() apod.
on jí tam má mysql_real_escape_string ale používá jí jen pro některé hodnoty
Trosku nechapu, pouzivam ji pro vsechny hodnoty krom cisel..., to by se melo vztahovat i na tuto, s jinou promenou pouzivanou v db v souboru nepracuji...
typicky je tam jen ta funkce primo pasnuta do sql - nevim k cemu je Ti ta validacni funkce, zbytecne tam nasekas pak chybu, ze na neco nemyslis - KISS KISS_principle
Delal jsem to pro to, abych nemusel psat mysql_real_escape_string() a mohl napsat jen check()...
a muzes psat je a? ne ;)
Ovsem jak vidis, tak real_escape_string mi neosetri vse...
ale osetri.
Zadaj si na vstup ' a sleduj si vystup, mas tam nejaku chybu v zdrojaku.
Aspon tak ja chapem tu hlasku Injection type is String (')
presne tak, nevidim duvod proc by to nemelo osetrit - od toho ta funkce JE a je testovana roky (ackoliv je to PHP , vyvojove kousek na programovacím jazykem KAREL či BALTÍK) a je k tomuhle pouziti urctena. To ze nekdo zada nevalidni vstup a ono SQL vyhodi chybu nevadi - hlavne aby tam nepropasoval SQL injection.
mimochodem na Oracle existuje uzasne SQL Injection pres defalutni string casu:
SELECT * FROM tbl where datum>sysdate-1
and
ALTER SESSION SET NLS_DATE_FORMAT="'10-10-99'; TRUNCATE TABLE USERS;";
ono ani testovane roky stacit nemusi, atomove elektrarne sa testuju 50rokov a furt dajaka vybuchne :D Ale neviem zhlavy o nicom co by real escape string prepustila (netvrdim ze nic neexistuje, uz som sa dlho "nehral" na hackthissite :D) Ale ked clovek chce kludne spat tak pouzije parametrizovany vstup, t.j. nebude si predavat meno hraca podla mena ale len ako index kdesi v cookie, a nic ine nedovoli len index (cislo) apod. dokonca s tym moze urobit aj matematicke operacie aby si bol isty ze to je cislo :D
To bych nedelal, zrovna nedávno jsem videl, ze se java zhroutila po zadání jistých čísel :D Prostě s nima nedokázala udělat tu operaci - razil bych to KISS - čím více kodu, tím větší šance na buffer overflow či vlastní chybu, krátký kod je rychlý, má menší pravděpodobnost chyb .. ačkoliv v práci je duležité ho prodlužovat logováním, aby věděli že nás platí za spoustu řádků
.. resp. zadaj si na vstup toto
(')