PHP: ochrana proti spamu a injekci MySQL

DK

Re:PHP: ochrana proti spamu a injekci MySQL
« Odpověď #15 kdy: 10. 09. 2012, 17:00:25 »
ano, presne tak

a do budoucna -> http://php.net/manual/en/book.pdo.php
je to v php od verze 5


PJ

Re:PHP: ochrana proti spamu a injekci MySQL
« Odpověď #16 kdy: 10. 09. 2012, 17:05:54 »
Jakub: ne, vubec to nechapes

Kód: [Vybrat]
$data=mysql_real_escape_string();
$prikaz=sprintf("mysql query s pouziti %s, %d apod, viz manual",$data);
$query=mysql_query($prikaz);


timhle navysis moznost zabraneni mysql injection, ale PORAD to nebude stoprocentni
Aky attack vector tam zostava, ak sa pouzije mysql_real_escape_string() a parametre su v uvodzovkach? Skus napisat konkretny dotaz a konkretny utok funkcny na aktualnych MySQL a PHP. (nejake diery tam boli, ale tie boli AFAIK zaplatane; nieco este mohlo ostat pri zmene kodovania medzi mysql_real_escape_string a samotnym dotazom, ale to zase robi malokto)

Inak aj ja som za PDO, ale ked uz je nieco napisane inak a "nejak" to funguje, tak by som to asi len tak neprerabal.

Jakub

Re:PHP: ochrana proti spamu a injekci MySQL
« Odpověď #17 kdy: 10. 09. 2012, 18:21:15 »
Ok ok ja myslím že jsme to tedy nějak shrnuli :o)
Každopádně díky za rady a názory !

Vím že je toho plný google určitě, ale nějaký vzor sprintf který se Vám osvědčil by někdo po ruce neměl ?

DK

Re:PHP: ochrana proti spamu a injekci MySQL
« Odpověď #18 kdy: 10. 09. 2012, 18:33:06 »
PJ: momentalne ti to z hlavy nereknu, ale zjistoval jsem si o tom par informaci a na stackoverflow jsme vykoumali neco malo, nicmene moje informace jsou vice nez rok stare (od te doby pouzivam pouze PDO)

Jakub: no jak vzory? proste tam narves ty sql query a misto promennych dosadis %X (kdy X je typ promenne, viz http://php.net/manual/en/function.sprintf.php )

PJ

Re:PHP: ochrana proti spamu a injekci MySQL
« Odpověď #19 kdy: 10. 09. 2012, 20:58:25 »
PJ: momentalne ti to z hlavy nereknu, ale zjistoval jsem si o tom par informaci a na stackoverflow jsme vykoumali neco malo, nicmene moje informace jsou vice nez rok stare (od te doby pouzivam pouze PDO)
PDO pouzivam aj ja, ale ide tu o to, ci sa oplati prerabat stare weby, ktore som robil este v dobach PHP4 alebo som ich ani nerobil a len sa mi nejak dostali pod ruky. Keby tam bola funkcna SQL injection, tak by to urcite malo zmysel.

Jakub: no jak vzory? proste tam narves ty sql query a misto promtennych dosadis %X (kdy X je typ promenne, viz http://php.net/manual/en/function.sprintf.php )
Jednoducho povedane: sprintf funguje skoro ako v C, akurat sa mu nedava prvy parameter a tento je vrateny funciou.
Z pohladu funkcnosti je uplne jedno, ci pouzije sprintf alebo kludne aj obycajne zretazovanie stringov alebo obycajne dosadzovanie premennych do stringov zapisanych v uvodzovkach. Akurat v druhom a tretom pripade si musi dat pozor na to, aby niekam omylom nedal podstrceny retazec namiesto cisla.


Re:PHP: ochrana proti spamu a injekci MySQL
« Odpověď #20 kdy: 11. 09. 2012, 01:31:20 »
Citace
Co se jinak ještě těch formulářů týče, tak obsahují skryté prvky jako "username" atd... které když jsou vyplněny tak se stane formulář neplatným.
Tohle bych nedoporucil, prohlizec/plugin to muze dolpnit automaticky

Jakub

Re:PHP: ochrana proti spamu a injekci MySQL
« Odpověď #21 kdy: 24. 09. 2012, 08:10:01 »
Dlouho jsem tu nebyl tak se omlouvám za tak pozdní odpověď.

Nic méně děkuju za Vaše názory a příspěvky !



Kit

Re:PHP: ochrana proti spamu a injekci MySQL
« Odpověď #22 kdy: 24. 09. 2012, 12:39:38 »
... zatimco pri pouziti pdo by to bylo takhle
Kód: [Vybrat]
$pdo=new PDO(...);
$prepared = $pdo->prepare("SELECT * FROM tabulka WHERE id = :id);
$prepared->bindParam(":id",$id,PDO::PARAM_INT); //PDO::PARAM_STR pro vsechno ostatni
$prepared->execute();
$row=$prepared->fetch(PDO::FETCH_ASSOC); //->fetchAll(...) pro vice radku

Tohle je jen jedna z možností, kterou ale nedoporučuji. Vázání proměnných je de facto variací na globální proměnné.

Daleko víc mi vyhovuje:
Kód: [Vybrat]
$pdo=new PDO(...);
$prepared = $pdo->prepare("SELECT * FROM tabulka WHERE id = :id");
$prepared->execute(array(":id"=>$id));
$row=$prepared->fetch(PDO::FETCH_ASSOC); //->fetchAll(...) pro vice radku

nebo v jednodušších případech
Kód: [Vybrat]
$pdo=new PDO(...);
$prepared = $pdo->prepare("SELECT * FROM tabulka WHERE id = ?");
$prepared->execute(array($id));
$row=$prepared->fetch(PDO::FETCH_ASSOC); //->fetchAll(...) pro vice radku

DK

Re:PHP: ochrana proti spamu a injekci MySQL
« Odpověď #23 kdy: 24. 09. 2012, 13:19:50 »
Kit: prave ze ne, v mojem pripade definujes i typ vlozenych dat, zatimco u tvojich se to nastavuje automaticky (nebo rovnou na string, coz by mohl by celkem problem u nekterych query)

s globalnimi promennymi to nema spolecneho vubec nic, ale samozrejme kazdemu vyhovuje neco jineho, ja pouzivam mnou zminene pouziti, ale to neznamena, ze nemuzes pozivat svoje :)

Kit

Re:PHP: ochrana proti spamu a injekci MySQL
« Odpověď #24 kdy: 25. 09. 2012, 08:06:59 »
Kit: prave ze ne, v mojem pripade definujes i typ vlozenych dat, zatimco u tvojich se to nastavuje automaticky (nebo rovnou na string, coz by mohl by celkem problem u nekterych query)

PDO si s tím poradí. Pokud je použit string tam, kde je očekáván integer, PDO provede konverzi na integer. Pokud konverzi není možné provést, použije se NULL. Problém jsem nezjistil. Zkus najít příklad, kdy se to bude chovat chybně.