Ochrana proti odeslani dat bez toho aniz byly odeslany z formulare
- Ja
- Člen | 260
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
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)
- David Matějka
- Moderator | 6445
@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.
- David Matějka
- Moderator | 6445
@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.
- David Matějka
- Moderator | 6445
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.