Jakým způsobem chránitě ajaxové requesty proti CSRF
- danielseek
- Člen | 42
Zajímalo by mě, jak chráníte ajaxovou část aplikace před CSRF. Pokud vím, že Nette na to nemá žádnou nativní funkcionalitu.
Je nejlepším řešením vygenerovat $token v session a ten potom předávat ajaxem mezi stránkami, abych ověřil legalitu požadavku?
Lze nějak token předávat, aniž by ho útočník mohl zachytit? Napadlo
mě načítat samotný token také ajaxem, bojím se ale, že to se dá také
snadno odchytit (stačí k tomu třeba jen obyčejný firebug).
Zatím to dělám takto
var token = {$token};
$.post({$url},{token: token, data: data, [...]})
Editoval danielseek (17. 11. 2013 23:31)
- frosty22
- Člen | 373
no s tím tokenem máš v podstatě pravdu .. jinak tady je extension https://github.com/…/application
A potom jak máš tu {$url} tak ji budeš prostě generovat {link foo!} a tam budeš již i ten token ..
- llook
- Člen | 407
Použij ten Hrachův trait, jak píše frosty22. Je to extrémně jednoduché
na použití, trait překryje link()
, aby přidával token a
signalReceived()
, aby ho kontroloval.
Pozor na jednu věc – používá různé tokeny pro různé parametry. Je to proto, aby když už někdo nějak získá token pro smazání článku 1, aby zároveň nezískal token pro smazání článku 2. Pokud ale potřebuješ přidávat nějaké parametry dynamicky javascriptem, tak to musíš nějak obejít.
Já to obcházím tím, že dynamické hodnoty posílám jako JSON v těle
POST požadavku a v obsluze signálu je získávám přes
JSON::decode(file_get_contents('php://input'))
(jenom nechápu,
proč načtení těla požadavku neumí Nette\Http\Request,
narozdíl od podobného objektu v SF2).