Ochrana proti odeslani dat bez toho aniz byly odeslany z formulare

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Ja
Člen | 260
+
0
-

Zdravim,
delam ted narychlo nejaky prava pro dva uzivatelske ucty – uzivatel (U) vs. admin (A). Admin pochopitelne muze vsechno. Mam uz z drivejska nejake reseni, ze v nejakem vysokem parent controlleru testuji, zda U nepristupuje na stranku na kterou nesmi.

Ale rikam si jak je to vlastne s formularema, kdy se vlastne formular odesle a callbackem se zpracovava. Daji se tam ta data nejak vpravit, nebo na to Nette mysli a ty formulare jsou tak napevno (s tim vlastnim zpracovanim) svazane, ze to bez pristupu na stranku s formularem proste neobejdete a ty data do toho zpracovavajiciho callbacku nedostanete?

Snad to co jsem napsal je dostatecne srozumitelne.

Diky moc
Ja

David Matějka
Moderator | 6445
+
0
-

ke zpracovani formulare dochazi na urovni zpracovani signalu. Pred tim tedy vzdy dochazi k zavolani checkRequirements, startup i actionFoo metody.
Jediny, na co si musis dat pozor, je, ze formular se nevaze na konkretni akci a je mozno ho vyvolat i z jine akce, priklad:

class FooPresenter
{

	public function actionZabezpeceno()
	{
		if(!user_id_admin()) $this->error();
	}
	public function actionNezabezpeceno()
	{

	}

	protected function createComponentFormKteryByMelBytZapezpeceny()
	{
	...
	}
}

je tedy mozno vyvolat akci „nezabezpeceno“ a soucasne vyvolat zpracovani formular. Tohle si tedy musis pohlidat.

Editoval matej21 (16. 9. 2014 15:28)

Ja
Člen | 260
+
0
-

Jinymi slovy,
pokud nevyvolam zpracovani formu odnekud zevnitr kodu:

public function actionNezabezpeceno()
{
	$this->zpracujForm($nejake_vals);
}

tak neni moznost, jak tam ta data dostat „zvnejsku“?

Jinak, mateji, ty jsi muj takovej dvorní odpovídač, diky ti za to :)

David Matějka
Moderator | 6445
+
0
-

@Ja: n, ani bys to tam nemusel volat rucne. Poslal bys proste POST pozadavek na akci nezabezpeceno, ale zpracoval by to formular, ktery by mel byt zabezpeceny. Vhodnou obranou je napriklad u ty tovarnicky kontrolovat, zda aktualni akce je „povolena“ pro tento formular.

Ja
Člen | 260
+
0
-

No jasne, ale pokud by tato metoda actionNezabezpeceno() – ve ktere je volani zpracovani formu – vubec neexistovala… tak jinak z vnejsku se k tomu zpracovani nijak nedostanu, ne?

David Matějka
Moderator | 6445
+
0
-

@Ja dostanes, pokud to nebudes mit nejak jinak osetreny. Nette hazi 404 az kdyz neexistuje sablona – coz zjistuje po zpracovani formulare. action* metoda vubec existovat nemusi.

Ale pokud overujes, zda je uzivatel admin, uz nekde ve startup metode, tak se nemusis niceho bat – tahle metoda se spusti vzdy pred zpracovanim.

Ja
Člen | 260
+
0
-

tak snad se spravne chapeme… mam actionEdit metodu, tzn. akce.latte ve kterym se form komponenta vykresluje, a tam muze jen admin

David Matějka
Moderator | 6445
+
+1
-

tak jeste jeden priklad (tentokrat trochu konkretneji)
predstav si articlepresenter, ktery ma akce edit a detail, detail muze zobrazit kazdy, edit pouze admin

class ArticlePresenter extends BasePresenter
{
	protected $article;

	public function actionEdit($id)
	{
		if(!$this->user->isAllowed('article', 'edit')) {
			$this->error(...);
		}
		$this->article = $this->findArticle($id);
	}

	public function actionDetail($id)
	{
		$this->article = $this->findArticle($id);
	}


	protected function createComponentEditForm()
	{
		$form = $this->editFormFactory->create($this->article);
		...
		return $form;
	}
}

takze kdokoliv muze jit na url http://example.com/article/detail/1, ale pouze ten, kdo ma opravneni, muze jit na http://example.com/article/edit/1.

Problem je v tom, ze metoda createComponentEditForm neni s zadnou akci asociovana a muze byt vyvolana pozadavkem na detail akci se spravnymi post parametry, ty mohou vypadat zhruba takhle:

do => editForm-submit
title => Upraveny titulek
content => Obsah clanku

kdyz tedy nekdo na posle tenhle POST pozadavek na /article/detail/1, tak ho actionDetail metoda nezablokuje – preci chce jen zobrazit clanek.
Ale onen do parametr s hodnotou editForm-submit zajisti, ze se vyvola zpracovani formulare.

Ja
Člen | 260
+
0
-

srozumeno, dekuju

Majkl578
Moderator | 1364
+
0
-

Pokud potřebuješ kontrolovat oprávnění, dělej vždy to tam, kde to je potřeba, v tvém případě tedy přímo v callbacku formuláře. (Jinak je to asi tak stejně správně, jako kdybys v modelu nevalidoval nic a spoléhal na validaci formuláře.)