Nette 2.0.3 a token formulara
- whitedeath
- Člen | 25
Ahoj,
prave skusam v najnovsej stable verzii Nette ochranu formularov proti CSRF utoku pridanim
<?php
$this->addProtection();
// resp.
$this->addProtection('Token isn\'t valid', 1);
?>
a v sablone mam tri rozne formulare a v kazdom mi to vygeneruje totozny kod, co by mi az tak nevadilo, ale vadi mi to, ze po refreshi stranky, aj po vymazani cache mi to generuje stale ten isty token, dokonca aj po pouziti formulara mi to vygeneruje ten isty kod…
tak som sa s tym hral a dal som si vypisat toto
<?php
public function addProtection($message = NULL, $timeout = NULL)
{
$session = $this->getSession()->getSection('Nette.Forms.Form/CSRF');
$key = "key$timeout";
if (isset($session->$key)) {
$token = $session->$key;
} else {
$session->$key = $token = Nette\Utils\Strings::random();
}
var_dump("token:". $token);die();
$session->setExpiration($timeout, $key);
$this[self::PROTECTOR_ID] = new Controls\HiddenField($token);
$this[self::PROTECTOR_ID]->addRule(self::PROTECTION, $message, $token);
}
?>
a random metodu som nahradil tymto:
<?php
$randstr = "";
for($i = 0; $i < $length; $i++)
{
$randnum = mt_rand(0, 61);
if($randnum < 10)
$randstr .= chr($randnum + 48);
else if($randnum < 36)
$randstr .= chr($randnum + 55);
else
$randstr .= chr($randnum + 61);
}
return $randstr;
?>
a stale mi to vyhadzuje ten isty token…
Moze byt chyba v nejakom mojom nastaveni? Alebo nieco robim uplne zle?
Dakujem za vas cas.
Editoval whitedeath (5. 4. 2012 0:45)
- whitedeath
- Člen | 25
Vdaka za odpoved,
takze mam este jednu otazku: ak to,
– ze v kazdom jednom formulari na stranke je ten isty token a to,
– ze po kazdom pouziti formulara je tam presne ten isty token a to,
– ze nech mam stranku otvorenu v lubovolnom pocte tabov a je tam stale
presne ten isty token
je normalne chovanie a zda sa mi to odveci, to je tym, ze nechapem ako pracuju sessions? Alebo cim to je? Pretoze sa mi to potom zda uplne zbytocne. Mam si nastudovat ako pracuju sessions? Alebo co mi odporucate na dalsie studium ohladom tohto?
Dakujem.
- David Grudl
- Nette Core | 8228
Je to v pořádku proto, že jako ochrana před CSRF je to dostačující. Předpokladem je, že se žádný token neprozradí.