Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem 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 :)

Předmět Autor Datum
Musis si osetrit napleni promenne $usr, pripadne vsech dalsich, ktere se v SQL dotazech uplatni. Urc…
Jan Fiala 04.05.2012 21:12
Jan Fiala
on jí tam má mysql_real_escape_string ale používá jí jen pro některé hodnoty
AZOR 04.05.2012 21:14
AZOR
Trosku nechapu, pouzivam ji pro vsechny hodnoty krom cisel..., to by se melo vztahovat i na tuto, s…
Swix 04.05.2012 22:02
Swix
typicky je tam jen ta funkce primo pasnuta do sql - nevim k cemu je Ti ta validacni funkce, zbytecne…
AZOR 04.05.2012 22:33
AZOR
Delal jsem to pro to, abych nemusel psat mysql_real_escape_string() a mohl napsat jen check()...
Swix 04.05.2012 22:50
Swix
function a($value){return mysql_real_escape_string($value);} a muzes psat je a? ne ;)
AZOR 04.05.2012 22:59
AZOR
Ovsem jak vidis, tak real_escape_string mi neosetri vse...
Swix 04.05.2012 23:26
Swix
ale osetri. Zadaj si na vstup ' a sleduj si vystup, mas tam nejaku chybu v zdrojaku. Aspon tak ja ch…
MM.. 05.05.2012 00:32
MM..
presne tak, nevidim duvod proc by to nemelo osetrit - od toho ta funkce JE a je testovana roky (acko…
AZOR 05.05.2012 00:35
AZOR
mimochodem na Oracle existuje uzasne SQL Injection pres defalutni string casu: SELECT * FROM tbl wh…
AZOR 05.05.2012 00:38
AZOR
ono ani testovane roky stacit nemusi, atomove elektrarne sa testuju 50rokov a furt dajaka vybuchne :…
MM.. 05.05.2012 00:48
MM..
To bych nedelal, zrovna nedávno jsem videl, ze se java zhroutila po zadání jistých čísel :D Prostě s… poslední
AZOR 05.05.2012 00:53
AZOR
.. resp. zadaj si na vstup toto (')
MM.. 05.05.2012 00:44
MM..

presne tak, nevidim duvod proc by to nemelo osetrit - od toho ta funkce JE a je testovana roky (ackoliv je to PHP :-D , 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.

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ů :-D

Zpět do poradny Odpovědět na původní otázku Nahoru