Test formuláře s CSRF protection
- zimmi
- Člen | 94
Mám jednoduchý test založený na Tester\TestCase
s následující metodou:
function testAddFormSent()
{
$request = new \Nette\Application\Request('Module:Presenter', 'POST', array(
'action' => 'add',
'do' => 'addForm-form-submit',
), array(
'param1' => 'test',
'param2' => 'test',
'param3' => 'test',
'_submit' => 'Odeslat',
'do' => 'addForm-form-submit'
)
);
$response = $this->presenter->run($request);
Assert::true( $response instanceof Nette\Application\Responses\RedirectResponse );
}
Testuje to odeslání formuláře a když u něj nechám zapnutý řádek s CSRF ochranou, vždycky skončí failem a v seznamu chyb formuláře vidím právě zprávu CSRF ochrany.
$form->addProtection('Vypršel časový limit, odešlete formulář znovu');
Když tenhle řádek vypnu, test funguje a proběhne v pořádku. V
setUp()
metodě testu si přihlásím uživatele:
function setUp()
{
$user = $this->container->getByType('Nette\Security\User');
$auth = $this->container->getByType('App\Admin\Model\Authenticator');
$this->presenter->user->storage->setNamespace('admin');
$auth->login(array('admin', 'admin'));
}
Tohle je jediný rozdíl proti jiným testům, které rovněž testují odeslání dat přes formulář s CSRF ochranou a které fungují – u přihlašovacích formulářů je uživatel anonymní, takže soudím, že by to s tím mohlo nějak souviset.
Jakým způsobem tedy otestovat takový formulář?
- mkoubik
- Člen | 728
Teď jsem to taky řešil – použil jsem
kdyby/fake-session
.
Nastav si $session->setFakeId(...)
na nejaky konstantni
retezec a
$session->getSection(CsrfProtection::class)->token = ...
zase
na jiny.
V CsrfProtection::validateCsrf()
si pak dumpni co za token to
z toho generuje a ten si dej napevno do toho testu (posli jako
_token_
ve formulari).