Novinky v Nette Forms 3.1

před 3 lety od David Grudl  

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 (RSS)

  1. super

    před 3 lety
  2. Skvělý

    před 3 lety

Chcete-li odeslat komentář, přihlaste se