Novinky v Nette Forms 3.1
Ochrana před CSRF pomocí cookie
Zranitelnost CSRF spočívá v tom, že formulář je podvržen útočníkem
a odeslán z jeho stránky, tedy i z jiné domény, proti čemuž má Nette
odjakživa ochranu, kterou zapíná metoda addProtection()
. Tuto
ochranu doplňuje nová a plně automatická ochrana pomocí cookie
s příznakem SameSite. Formuláře v Nette Application se tak chrání již
od verze 3.0 a nyní přichází na řadu i samostatně používané
(standalone) formuláře.
Volání addProtection()
má stále význam i přesto, že
prohlížeče, které SameSite nepodporují, pomalu mizí. Problém by mohl
nastat ve chvíli, kdy by se někdo zmocnil subdomény např.
foo.example.com
a tam vytvořil cookie. Ta má totiž stejný
„site“ jako subdoména www.example.com
a cookie by se tak
odeslala i na požadavek na www.example.com
.
Standalone formulář odešle cookie automaticky. Předpokládá se, že
formulář vytváříte v době, kdy ještě hlavičky nejsou odeslané,
protože zpravidla po úspěšném zpracování formuláře následuje
přesměrování na jinou stránku, což se hlavičkou realizuje. Pokud
z nějakého důvodu narazíte na problém, že hlavičku už nelze odeslat,
můžete tak učinit dříve pomocí
Nette\Forms\Form::initialize()
.
Pokud tuto ochranu chcete vypnout a tedy umožnit, aby formulář šel
odeslat z jiné domény, použijte $form->allowCrossOrigin()
.
To platí i pro formuláře z Nette Application.
Bezpečnější
chování onSuccess
, onClick
a
getValues()
Metoda setValidationScope()
slouží k omezení prvků, které
se mají při odeslání určitým tlačítkem validovat. Jen ty prvky, které
se validují, jsou nyní uvedeny v proměnné $values
předávané
handlerům událostí onSuccess
a onClick
. Ve
$values
tak nebudou nevalidovaná data.
Stejná změna se týká metody $form->getValues()
, která
nyní také vrací jen validované prvky. Navíc, pokud getValues()
zavoláte dříve, než proběhla validace, Nette vás upozorní
varováním.
Pokud z nějakého důvodu potřebujete získat hodnoty všech prvků
nezávisle na validaci, tak jak to dělalo getValues()
v předchozích verzích, použijte novou
metodu $form->getUntrustedValues()
Mimochodem, pokud v handleru pro onSuccess
či
onClick
nepotřebujete objekt formuláře ale jen hodnoty, můžete
parametr $form
vynechat ($values
musí mít
typehint):
public function formSucceeded(array $values): void
{
...
}
Srozumitelnost
Kvůli lepší srozumitelnosti byla přejmenována metoda
Checkbox::getSeparatorPrototype()
na
getContainerPrototype()
a dále Form::addImage()
na
addImageButton()
. Samozřejmě nadále fungují původní názvy
jako aliasy.
Další
Pravidlo Form::URL
nyní doplňuje chybějící protokol
https
místo http
, takže pokud uživatel zadá
nette.org
, výsledná hodnota bude
https://nette.org
.
Metoda $vals = $form->getValues(FormData::class)
vrací
hodnoty mapované na objekt dané třídy. Nyní lze použít i hydrataci
pomocí $vals = $form->getValues(new FormData)
.
Formuláře již nevytváří v šabloně proměnné $_form
,
které jsou deprecated od Nette 2.4.
Minimální požadovaná verze PHP je 7.2.
Komentáře
super
Skvělý
Chcete-li odeslat komentář, přihlaste se