Autor Zpráva
KubaFibi
Profil
$id = "1 OR 1=1 --";
$psw = "123";
$dotaz = "SELECT * FROM uzivatele WHERE id=$id AND password='$psw'"
tento dotaz je ve výsledku: SELECT * FROM uzivatele WHERE id=1 OR 1=1 -- AND password='123'
a ten je ekvivalentní s SELECT * FROM uzivatele

1) Stačilo by jako ošetření toto: ?
$id = "1 OR 1=1 --";
$psw = "123";
$dotaz = "SELECT * FROM uzivatele WHERE id='$id' AND password='$psw'";
popř.
$dotaz = "SELECT * FROM uzivatele WHERE id='".$id."' AND password='".$psw."'";
kde výsledný dotaz je podle mého předpokladu: SELECT * FROM uzivatele WHERE id='1 OR 1=1 --' AND password='123'
Má ten apostrof, uvozovka, tečka ('".promenna."') nějaký význam nebo je to stejné jako v prvním případě?

2) Který dotaz je lepší?
3) Způsobí můj dotaz i to, že nebude potřeba escapovat znaky?
4) Dá se to udělat lépe?
Kajman
Profil
$dotaz = "SELECT * FROM uzivatele WHERE id=".(int)$id." AND password='".mysql_real_escape_string($psw)."'";
Keeehi
Profil
1) Nestačilo. Viz $id = "1' OR 1=1 --";
2) Všechny jsou špatně
3) Ne
4) Viz [#2]
KubaFibi
Profil
díky, úplně jsem zapoměl na možnost, že by tam někdo napsat '

takže (int)$id definuje že to musí být číslo? A když by nebylo zadáno číslo, co se tam doplní? NULL?
mysql_real_escape_string() escapuje znaky to už vím.

Pak jsem ještě četl o funkci intval(), ale moc jsem nepochopil k čemu se to v tomto případě hodí.
Keeehi
Profil
(int)$id je přetypování. Pokud je tam něco jiného než číslo, bude z toho nula.
intval() dělá vlastně to samé, akorát, že je to funkce

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: