Autor Zpráva
joe
Profil
Ahoj,

chci se jen poptat jak chráníte formuláře před znovu odesláním?
Mít jediný token mi přijde jako kdyby tam žádná ochrana nebyla, generovat vždycky nový token je dobrý nápad,
ale pokud je otevřeno víc oken... Ukládání tokenu do pole sessions? A vlastně, jsou ty tokeny vůbec k něčemu?
Mně přijde že ne, ale už je odebírat nebudu :)

EDIT: vážně nemyslím header po zpracování formuláře. Abych to upřesnil, jedná se mi spíš o ochranu před CSRF.

Sice jsem to nezkoušel, ale pokud už je nějaká stránka napadnutelná JavaScriptem, pak si myslím, že tokeny jsou právě k ničemu, protože se dají v dokumentu pomocí JS zjistit nebo ne?
SwimX
Profil
já mám captchu..
joe
Profil
SwimX
Nechci captchu, to už je lepší nějaká normální otázka, na kterou zná každý odpověď se mi zdá.
srigi
Profil
joe
Po spracovani formulara presmeruj pomocou header();
joe
Profil
srigi
To je jasné, na to jsem se zrovna neptal. Myslel jsem třeba nějaký větší útok, dvojí odeslání (2x stisknutí Odeslat) apod. Vlastně to, k čemu jsou určené tokeny, jenom když se nad tim zamyslim, nevim k čemu ty tokeny vlastně vůbec jsou.
Mastodont
Profil
Vždyť už jsi to napsal - při každém odeslání formuláře uložíš token, při příjmu ho zkontroluješ.
joe
Profil
Mastodont
Sakra... neumim v tuto hodinu už asi moc dobře vysvětlovat. Vim, že uložím token, ale otázka je, jestli ten token k něčemu vůbec je. Tak mě jen zajímá, jak to dělají lidé tady, z fóra.
Mastodont
Profil
joe
Já to dělám tak, že došlý POST formuláře zahodím, pokud není v sešně uložen token souhlasící s tokenem v hidden poli toho formuláře. Každý odeslaný formulář má svůj vlastní token.
joe
Profil
Mastodont
Ok, takže to nefunguje pro více otevřených oken se stejným formulářem? Nebo ukládáš do pole? Pak by to chtělo asi více rozměrné pole i pro uložení času vytvoření a po nějakém času je mazat, mohly by se tam docela nakupit.
srigi
Profil
joe
Ok, takže to nefunguje pro více otevřených oken se stejným formulářem... ...by to chtělo asi více rozměrné pole i pro uložení času vytvoření a po nějakém času je mazat...

Noo ked sa nad tym zamyslim, ked uz viem aku funkcionalitu kces dosiahnut - tak bude treba kazdemu formularu vygenerovat unikatny token. Ten sa niekde ulozi (session, este lepsie SQLite) s platnostou napr. 1h spolu s flagom o platnosti. Pri prijme kazdeho formulara sa kuknes na toto miesto a skontrolujes ci je flag nastaveny tak, ze formular prijimes. Hned po tejto operacii flag prehodis. Ulozne miesto treba samozrejme premazavat.

Podobnu funkcionalitu s hodinovou platnostou requestu s ukladanim do SQLite kedysi napisal Hulan. Jednalo sa formular s CAPTCHou. Skus si to najst a preletiet zdrojak.
joe
Profil
srigi
Ok, díky. Zkusim se po tom podívat. Ale stejně, je to na stejném principu, ať už ten generovaný token ukládám kamkoli, tak pokaždý ho musim dát třeba do skrytýho pole ve formuláři, abych ho pak mohl ověřit. A nemyslím si, že je takový problém si ho JavaScriptem přečíst a následně doplnit třeba do jiného formuláře, který by byl někde schovaný (třeba když beru v úvahu CSRF).
bohyn
Profil
CSRF
Pokud na formulare pouzivas POST a kontrolujes pres spravne promene (tedy nepouzivas register_globals a $_REQUEST), tak se XSRF nechyta.
Mastodont
Profil
joe
nemyslím si, že je takový problém si ho JavaScriptem přečíst a následně doplnit třeba do jiného formuláře

Samozřejmě si včetně tokenu ukládáš i název formuláře ...
srigi
Profil
bohyn
Pokud na formulare pouzivas POST a kontrolujes pres spravne promene (tedy nepouzivas register_globals a $_REQUEST), tak se XSRF nechyta.

No tak toto je velmi rozsirena povera. POST pred CSRF nechrani (odbura script kiddies, ale skutocny hacker si poradi).

joe
Ale stejně, je to na stejném principu, ať už ten generovaný token ukládám kamkoli, tak pokaždý ho musim dát třeba do skrytýho pole ve formuláři, abych ho pak mohl ověřit. A nemyslím si, že je takový problém si ho JavaScriptem přečíst a následně doplnit třeba do jiného formuláře...

Vsak pisem, v ulozisku si k tokenu ulozis aj bolean flag, ktory pri prvom spracovani formulara prehodis. Ked neskvor pride formular s rovnakym tokenom, pozries na flag a podla toto formular spracujes alebo odmietnes.

Formulare bez tokenu automaticky zahadzuj. Taketo spravanie ta ako jedine ochrani pred duplicitami a CSRF.
joe
Profil
Mastodont
Takže nedáváš token do skrytého pole?

srigi
Kód na Captchu s SQLite od Hulána jsem našel, captcha by to řešila, ale u tokenu ve skrytém poli to stejně nechápu, resp. si myslim, že to jde obejít a napíšu jak to myslim:

Teď beru v potaz (to je samozřejmě špatně, neměla by mít), že stránka má někde chybu a je napadnutelná JavaScriptem. Zlomyslný uživatel vyrobí takový js kód, ve kterém si zjistí vždy nově vygenerovaný token co je zapsaný ve skrytém poli ve formuláři a může si dál dělat co chce.

Tzn, že by ty tokeny řešily jen duplicity.

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