`nette-samesite` trvale? Jak řešit <iframe>?
- JaxP
- Člen | 62
Zdravím,
všiml jsem si, že v Nette 3.0 je na více místech použita funkce
isSameSite()
v návaznosti na cookie nette-samesite
.
Což znamená, že formuláře jsou z iframu nefunkční (resp. končí na
redirect('this')
). Z pohledu CSRF je to fajn, ale co v situaci,
kdy opravdu chci povolit zpracování handlerů z iframu (třeba pro
konkrétní URL). Je zde nějaká možnost konfigurace nebo nastavení?
Děkuji
Editoval JaxP (7. 10. 2019 15:19)
- David Grudl
- Nette Core | 8227
Můžeš přesněji popsat, jakou úlohu řešíš? Jde o iframe odesílající formulář na jinou doménu?
- JaxP
- Člen | 62
Ne, formulář odesílá stále na svou doménu.
Příklad:
- Máme Nette na doméně XY.cz. Stránka obsahuje formulář. Nikdy nesměruje nikam ven – vše se odehrává stále na stejné doméně ve stejném prostředí.
- Následně máme jiný web na doméně YZ.cz, která zobrazuje naši
stránku jako
<iframe>
. Routování funguje, ale odesílání formuláře ne. ⇒ tzn. formulář se vykreslí, já ho vyplním a odešlu. Následně skončím vApplication\UI\Form
vsignalReceived(...)
na podmínce!$this->getPresenter()->getHttpRequest()->isSameSite()
resp.$this->cookies['nette-samesite']
(které v cookies opravdu není v tomto případě).
- Stejsi
- Člen | 21
David Grudl napsal(a):
Přidal jsem
$form->disableSameSiteProtection();
Díky Davide, také to teď řeším.
Kdy zhruba to budeš commitovat?
Neuvažuješ že by si to přidal i do configu?
Zkoušel jsem nastavit
`http:
frames: true`
a
`session:
cookieSamesite: null`
ani jeden z těchto parametrů odesílání formuláře v iframu (který
není na stejné doméně) nevyřešil.
Takže hromadně pro formuláře by se to mohlo nastavit nějak takto?
`form:
csrf: false`
Ještě jednou děkuji a ať se daří :-)
Editoval Stejsi (22. 10. 2019 17:50)
- David Grudl
- Nette Core | 8227
Hromadně to nastavit pro formuláře lze tak, že budeš všechny vytvářet
společnou
továrničkou a v ní zavoláš
$form->disableSameSiteProtection()
.
Jiný způsob není možný, protože formuláře se globálně nekonfigurují.
- Stejsi
- Člen | 21
David Grudl napsal(a):
Hromadně to nastavit pro formuláře lze tak, že budeš všechny vytvářet společnou továrničkou a v ní zavoláš
$form->disableSameSiteProtection()
.Jiný způsob není možný, protože formuláře se globálně nekonfigurují.
Díky moc za odpověď.
Commit jsem našel a použil to jak říkáš.
Formuláře v iframu již fungují.
Ještě jsem narazil na jeden problém s framem,
když postuji pomocí xhr (javascriptu) form data na do handle na serveru
(konkrétně upload souboru),
tak mi to v iframu (pouze v iframu, jinak to jde) vrací pro danou url adresu
status 303 a soubor se nenahraje.
Nějaký nápad, čím by to mohlo být..? :-)
Do handle požadavek vůbec nedojde.
Díky za pomoc!!!!
Editoval Stejsi (22. 10. 2019 21:56)
- David Grudl
- Nette Core | 8227
To bude asi stejná příčina. Zkus u handle doplnit anotaci:
/**
* @crossOrigin
*/
function handleXy()
{}
- Barbarossa
- Člen | 74
Ahoj, řešíme teď stejnou situaci pro codeception (contributte), který ve
svém http nemá isSameSite()
ani naimpelmetovaný a než to
řešit tam, tak mě přijde hezčí mít možnost to v konfigu úplně
vypnout. Nebo mám udělat PR, který tam tu implementaci doplní? Díky
Editoval Barbarossa (30. 3. 2020 13:28)
- Marek Bartoš
- Nette Blogger | 1274
Doplnit do codeception, metoda není v interface jen z důvodu BC breaku