Bezpečnost komponent a callbacků
- Pan Dobrman
- Člen | 45
Dobrý den, může někdo nepovolaný přistoupit ke callbackům, které se volá při odesílání formuláře (v případě, že má zakázaný action, ve kterém se nachází komponenta)? Zajímá mě, zda-li je nutné zabezpečovat komponenty a jejich callbacky. Zatím zabezpečuji jen akce a signály, ale nerad bych měl v aplikaci bezpečnostní díru.
protected function createComponentForm()
{
$form = new Form;
$form->addSubmit('submit', 'remove');
$form->onSuccess[] = callback($this, 'processForm');
return $form;
}
public function processForm() //Může role 'guest' zavolat tuto metodu, ikdyž nemá přístup k akci, ve které je komponenta 'form'?
{
$this->removeSomething();
}
- Pan Dobrman
- Člen | 45
Děkuji za odkazy. Pokud jsem to pochopil správně, tak metoda „processForm“ není dostupná přímo (pomocí url), ale pouze pomocí signálu formuláře (…/Homepage/default?do=form-submit). Tím pádem stačí zabezpečit jen továrničku na formulář. Je to tak?
Editoval Pan Dobrman (24. 1. 2013 21:54)
- enumag
- Člen | 2118
Alternativní přístup, který používám já, je povolit samotné vytvoření komponenty jen pro určitou akci (či akce). To lze implementovat poměrně snadno v BasePresenteru:
/**
* @param string $name
* @return \Nette\ComponentModel\IComponent
*/
protected function createComponent($name)
{
$ucname = ucfirst($name);
$method = 'createComponent' . $ucname;
$presenterReflection = $this->getReflection();
if ($presenterReflection->hasMethod($method)) {
$reflection = $presenterReflection->getMethod($method);
$this->checkRequirements($reflection);
if (!$reflection->hasAnnotation('Action')) {
throw new \Nette\Application\ForbiddenRequestException("Missing @Action annotation for component '$name'.");
}
$annotations = (array) $reflection->getAnnotation('Action');
if (!empty($annotations) && !in_array($this->getAction(), $annotations)) {
throw new \Nette\Application\ForbiddenRequestException("Creation of component '$name' is forbidden for action '$this->action'.");
}
return parent::createComponent($name);
}
}
Signál se provádí později než akce takže pokud by kontrola u akce neprošla, k tomu signálu by se to už vůbec nedostalo.
Výše uvedená funkce tě bude nutit u továrničky každé komponenty
výslovně specifikovat, pro které akce je povolena. Bez té anotace
@Action
komponentu nebude možné vytvořit vůbec (pokud ti to
nevyhovuje, můžeš kód modifikovat).
/**
* Komponenta form pouze pro akce add a edit.
* @Action (add, edit)
*/
protected function createComponentForm() { ... }
EDIT: Bacha na případ kdy nemáš action* metodu a tu kontrolu provádíš až v metodě render*, to ošetřené není, protože signál se provádí dříve než render*.
Editoval enumag (24. 1. 2013 21:40)