Autor Zpráva
securityy
Profil *
ahoj

v jednim clanku o bezpecnosti jsem narazil na nasledujici vec.

autor tvrdi ze tohle bezpecne neni

if ((int)$_GET['del']) {
mysql_query("DELETE FROM user WHERE id=".$_GET['del']);
}

a ze spravne by to melo byt takhle

if ($_GET['del'] = (int)$_GET['del']) {
mysql_query("DELETE FROM user WHERE id=".$_GET['del']);
}

nebo takhle

if ((int)$_GET['del']) {
mysql_query("DELETE FROM user WHERE id=".(int)$_GET['del']);

at delam co delam tak mi i prvni pripad pride vporadku. proste pokud $_GET['del'] neni cislo tak se obsah podminky nikdy neuskutecni. proc to tedy uvnitr podminky znovu resit?
Alphard
Profil
v prvním případě projde třeba: "5 and id > 0"

druhý a třetí případ můžeš zkrátit na mysql_query("DELETE FROM user WHERE id=".(int) $_GET['del']);
je to téměř stejné, pouze pokud vznikne nula, pokusí se databáze smazat řádek s id 0
Mastodont
Profil
Hm, já bych tedy řekl, že posílat akci delete v GET je prasárna nezávisle na nějakém přetypování ...
dRaGen
Profil
mastodont: a jak bys ji chtel jinak poslat ? kdyz mas dejme tomu seznam veci a chces urcitou smazat ? a nemit to jako tlacitko ...
securityy
Profil *
Alphard

diky moc. nenapadlo me ze projde "5 and id > 0" myslel jsem ze projdou jen cisla. ted uz je mi to jasne.


Mastodont

kdyz uz jsi to nakousl. kdyz mam treba clanky u ktere mohou administratori/moderatori editovat/mazat clanky jakym zpusobem to tedy resit??
co jsem prosel par jednodussich reseni tak to vzdy bylo stylem ze u vypisu clanku pokud mel dotycny dostatecna prava tak se obevily odkazy
stylem edit-smaz.php?smaz=5 resp edit-smaz.php?edit=5 a po kliknuti se na strance edit-smaz.php overilo jestli ma dotycny prava na smazani
a pote se v databazi nasel clanek s id=5 a ten se smazal nebo editoval.
Mastodont
Profil
securityy
Já jsem zřejmě četl články úplně jiných lidí a veškeré akční požadavky posílám POSTem :-)) Plus samozřejmě token ve formuláři, generovaný na serveru při každém odeslání FORMu.
securityy
Profil *
Mastodont

no prave ze to nemam z zadneho clanku jen jsem to videl v nekolika scriptech na hotscripts. v pouzití post misto get nejak moc nevidim vyhodu. proste pokud pres smazanim/ editovanim zkontroluji jestli na to ma dany uzivatel pravo tak mi muze byt celkem jedno pres co mi to prijde. clovek ktery prava nema si dopsanim cehokoli do get proste imho nepomuze.

jinak mit u seznamu 30ti veci tricet formularu s tlacitkem smazat se mi moc nezamlouva.
r0me0
Profil
Mastodont
můžu se zeptat co je ten token ve formuláři? Na googlu sem nic nenašel...
Mastodont
Profil
r0me0
http://shiflett.org/articles/foiling-cross-site-attacks

V podstatě jde o to, že každý odeslaný formulář dostane jedinečnou hidden hodnotu a ta je při příjmu kontrolována - pokud nesouhlasí nebo není, je formulář prostě ignorován.
ninja
Profil
Mastodont: bezpecnostni rozdil mezi prakticky GET a POST zadny neni, podvrhnout lze oba.

Jedinecny token pro kazdou transakci je dobre reseni, ale mzoan zbytecny overhead pro nekriticke aplikace. Tam myslim session (respektive token pro celou seanci stejny) postaci.

Ja bych zase rekl ze vetsinou neni rozumne skutecne mazat (sql DELETE), ale radeji jen nastavit priznak radku "smazano".
Mastodont
Profil
ninja
Ano, podvrhnout jde obojí, ale možnost zabookmarkovat si adresu pro smazání nebo přidání něčeho se mi prostě nelíbí.

A s tím příznakem máš taky recht, i když je IMHO lepší přesun do archivu, aby se nekomplikovali selecty.

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:

0