Bezpečnost komponent a callbacků

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

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();
}
bazo
Člen | 620
+
0
-

zobrazenie, spracovanie formu nie je naviazane na action, takze mozne to je

Pan Dobrman
Člen | 45
+
0
-

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)

Jan Tvrdík
Nette guru | 2595
+
0
-

@Pan Dobrman: Ano, je to tak.

enumag
Člen | 2118
+
0
-

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)