ochrana formuláře proti změně předvyplněné hodnoty z klienta

bojovyletoun
Člen | 668
+
0
-

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
+
0
-

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
+
0
-

@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
+
0
-

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
+
0
-

@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
+
0
-

@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í.