Jakým způsobem chránitě ajaxové requesty proti CSRF

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
danielseek
Člen | 42
+
0
-

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
+
0
-

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
+
0
-

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).