ochrana formuláře proti změně předvyplněné hodnoty z klienta
- bojovyletoun
- Člen | 668
Zdravim z minulosti, dejme tomu, že mám formulář pro komentáře na stránce, kde je jednotná action pro bez ohledu na URL článku (články jsou typicky /clanky/1234-nazev ,ale action pro přidání komentu je /clanky?do=pridat-koment nebo tak). To je dané, to se měnit nebude.
A id článku se odesílá jakožto input type = hidden. Další prvky formuláře jsou typicky jmeno a text.
A teď, je nějak možné zabezpečit tento formulář, aby si nešlo v console id změnit za id jiného článku?
Možná dotaz vyznívá, jakože to není reálná situace z nette frameworku. A jako že se ptám z prostředka – z pohledu pozorovatele. Je to tak. Tak bych rád znal odpověď, jestli pokud bych chtěl formulář udělat v nette frameworku, nebo už je,
- zda tohle už řešené automaticky
- nebo stačí (jde to?) přidat něco jako $form->addCSRFProtection() ?
(a co kdybych chtěl udělat opačnou situaci, že chci přidat ->addHidden() s předvyplněnou hodnotou, ale dát svobodu hodnotu změnit scriptem na klientovi)
Editoval bojovyletoun (25. 2. 18:44)
- Marek Bartoš
- Nette Blogger | 1309
CSRF je ochrana, aby se formulář neodeslal z jiného webu, ne aby jsi
v něm nezměnil hodnoty.
ID formuláře je skryté, ale pořád je v html kódu, který si může
každý kdo ví jak editovat jak chce.
Oprávnění musíš kontrolovat i při odeslání dat, nejen při jejich
zobrazení.
- m.brecher
- Generous Backer | 905
@bojovyletoun
Input Hidden umožňuje zadat chráněnou persistentValue hodnotu konstruktorem, místo:
$form->addHidden('article_id')
->setDefaultValue($articleId);
použij:
$form->addComponent(new Hidden($articleId) 'article_id');
není to v dokumentaci, vyzkoušené osobně to nemám, poradil mě to @DavidGrudl
Tohle by měla být neprůstřelná ochrana, kterou potřebuješ.
Editoval m.brecher (25. 2. 19:30)
- Kamil Valenta
- Člen | 844
m.brecher napsal(a):
použij:
$form->addComponent(new Hidden($articleId) 'article_id');
Jenže tazatel bude mít v actioně /clanky?do=pridat-koment problém „kde
vzít“ $articleId.
To proto si jej tahá v hiddenu.
Než bych flastroval bolístku, napřed bych se zamyslel, zda k ní vůbec musí docházet.
Jaký je důvod všechny formy posílat na společnou actionu /clanky ?
Proč se ten handle formuláře nevykonává nad aktuálně rozběhlou
actionou?
Tedy /clanky/1234-nazev?do=pridat-koment
Protože pak by bylo $articleId dostupné i bez hidden pole. A tím pádem i nepodvrhnutelné.
- m.brecher
- Generous Backer | 905
@KamilValenta
Jenže tazatel bude mít v actioně /clanky?do=pridat-koment problém „kde vzít“ $articleId. To proto si jej tahá v hiddenu.
Jak si $articleId do hidden prvku dodá je jeho věc, jenom jsem upozornil na zajímavou možnost použít chráněný hidden prvek, protože to není v dokumentaci a je to škoda. Hodně lidí hidden prvek používá s pocitem falešného bezpečí. Protože jde o bezpečnost, asi by nebylo na škodu to v dokumentaci zmínit, když už v Nette tato feature je.
- m.brecher
- Generous Backer | 905
@bojovyletoun
a co kdybych chtěl udělat opačnou situaci, že chci přidat ->addHidden() s předvyplněnou hodnotou, ale dát svobodu hodnotu změnit scriptem na klientovi
Pokud bude server akceptovat editovanou hodnotu z hidden prvku, potom musíš na serveru validovat oprávnění.