Моя программа использует Zend Framework, и я хотел защитить пользователей от CSRF с помощью Zend_Form_Element_Hash. Но, похоже, это не работает.
Например, мой код для формы выхода из системы
$exithash = new Zend_Form_Element_Hash('hihacker', array('salt' => 'exitsalt'));
$this->addElement($exithash);
В моем плагине Auth для контроллера я делаю
$exitForm = new R00_Form_Exit();
if ($exitForm->isValid($_POST)) {
R00_Auth::logout(); // a wrapper for Zend_Auth::getInstance()->clearIdentity();
Zend_Registry::get('Log')->info('User has logged out');
$this->setRedirect($request); // redirect to the current page
}
И в моем макете
echo new R00_Form_Exit();
Хорошо. Но это не работает, я нажимаю кнопку отправки формы, страница перезагружается, но идентичность все еще существует.
Как я понял, Zend_Form_Element_Hash генерирует новое значение хеша для каждого времени, когда форма создает и сравнивает хеш от пользователя с хешем из сеанса - последний сгенерированный хеш! Это очень странно Даже если я попытаюсь, например, создать только один R00_Form_Exit в моем приложении, сохранить его в реестре и вывести его из него, открытие страницы с моего сайта «в новой вкладке» приведет к тому, что все такие формы, защищенные csrf, перестанут работать. 1014 *
Итак, как мне защитить?