Open pohadkar opened 6 years ago
pokud je formular ve view sablone, je je jeden na strance a odesila se POSTem, je vse v poradku. problem nastava v techto pripadech.
da se resit bud tak, ze se na tyto ajaxove requesty csrf middleware nepouziva, nebo ze se pouzije tzv. persistent klic. ten ale v nasi verzi csrf jeste neni. museli bychom zvednout verzi. vetsinu ajaxu navic mame delanych tak, ze slouzi jen jako dotazy na vypis neceho. a neslouzi jako formulare. takze zatim to resime tak, ze na ajaxy csrf nepouzivame.
jak funguje CSRF middleware:
pouziti middleware sestava ze dvou casti. ->add(new \Glued\Middleware\Forms\CsrfViewMiddleware($container))->add($container->csrf)
prvni cast: add(new \Glued\Middleware\Forms\CsrfViewMiddleware($container)) pridava globalni promennou csrf.field jejiz obsah naplni dvema inputy s predgenerovanymi overovacimi klici. pokud je pak vysledek renderovan pomoci view a v sablone se nachazi {{ csrf.field | raw }}, je tento v procesu renderu nahrazen tou globalni promennou.
druha cast: (protoze se middleware zpracovavaji systemem lifo, provede se pred prvni casti) add($container->csrf) funguje takto: pro kazdy dotaz typu 'POST', 'PUT', 'DELETE', 'PATCH' provede overeni, jestli jsou pritomny overovaci klice a porovna je s posledne vygenerovanymi, ktere ma v session. pri neexistenci nebo nesouladu vraci ruzne chyby :) dale vygeneruje nove overovaci klice a ulozi si je do session, at je typ dotazu jakykoliv (napriklad i GET).
znamena to, ze pri kazdem requestu jsou vygenerovany nove klice a plati pouze na zacatku dalsiho requestu.