Autor Zpráva
Magnus123
Profil
Ahoj.

Někde jsem četl, že proti CSRF stačí mít u každého uživatele uložený (v DB) trvalý token a ten používat. Je to dostačující způsob, nebo je lepší po každé akci generovat nový?
ShiraNai7
Profil
No mělo by to stačit ve většině případů, ale nejefektivnější je ho pokaždé vygenerovat.
Magnus123
Profil
Mohl/a bys mi, prosím, vysvětlit, ve kterém případě to fungovat nebude?
joe
Profil
Dobré je token po každé akci změnit, protože pokud budeš používat pořád ten samý (každý uživatel, jiný token) a útočníkovi se ho pokusí zjistit, dá se toho zneužít.
Jan Tvrdík
Profil
joe:
Dobré je token po každé akci změnit
To je velmi špatné řešení a uživatelé tě za ně budou nenávidět, protože jim vezmeš možnost pracovat s aplikací ve více oknech.

Magnus123:
Trvalý token v DB mít můžeš, ale nikdy nesmí opustit server. Skutečný token (řetězec vkládaný do skrytého pole formuláře nebo do URL) by měl být vázaný na session id uživatele, takže ho můžeš spočítat třeba jako sha1($dbToken . $sessionId). Ještě lepší je mít jiný token pro každou akci (třeba sha1($dbToken . $sessionId . 'clanek/smazat/#27')).
ShiraNai7
Profil
Jan Tvrdík, Magnus123:
To je velmi špatné řešení a uživatelé tě za ně budou nenávidět, protože jim vezmeš možnost pracovat s aplikací ve více oknech.

Já to jednou vyřešil tak, že ukládám (do session) až 30 posledních vygenerovaných tokenů (není to nijak datově náročné, jsou to obyčejné hashe). Jakmile je některý token použit, je odstraněn. Problém by nastal až při obrovském množství oken a i poté je možné (přes upozornění) odeslat formulář znovu bez ztráty dat.
joe
Profil
Jan Tvrdík:
To je velmi špatné řešení
Řešením jak to "obejít" pro více oken napsal už ShiraNai7, rozhodně se mi ale generování nového tokenu po každé akci zdá daleko víc bezpečnější, než používat ten samý, i když pro každého uživatele jiný, pro jednu stejnou akci. Útočníkovi pak stačí zjistit daný token a může být problém.
Jan Tvrdík
Profil
joe, ShiraNai7:
Pokud po vygenerování nového tokenu zůstává původní token stále platný, tak naopak bezpečnost ještě snižujete.

Útočníkovi pak stačí zjistit daný token a může být problém.
Jak jsem již psal, tak „skutečný token“ by měl být správně pro každou akci a zdroj jiný.
ShiraNai7
Profil
Jan Tvrdík:
Pokud po vygenerování nového tokenu zůstává původní token stále platný, tak naopak bezpečnost ještě snižujete.

psal jsem:
Jakmile je některý token použit, je odstraněn.

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: