Как использовать Zend_Form_Element_Hash? - PullRequest
3 голосов
/ 27 октября 2009

Затем я пытаюсь использовать Zend_Form_Element_Hash, он регенерирует хеш при каждом запросе.

В моем коде:

 // form
 $this->addElement('hash', 'hihacker', array('salt' => 'thesal'));

Затем я сбрасываю $ _SESSION. Я вижу новое значение при каждой перезагрузке страницы.

Затем я отправляю форму, которая сообщает об ошибке «Токен« 28a5e0e2a50a3d4afaa654468fd29420 »не соответствует данному токену« a64407cc11376dac1916d2101de90d29 '», каждый раз - новая пара токенов

Ответы [ 3 ]

6 голосов
/ 29 октября 2009
$form = new Form();
$form->addElement('hash', 'hihacker',
    array('salt' => 'YOUR TOO MUCH SALTY TEXT !!@@'));
if ($this->_request->isPost() && $form->isValid($this->_request->getPost())) {
    // Valid ! you are safe do what ever you want .
} else if (count($form->getErrors('request_token')) > 0) {

    ///get him to the error controller 
    $this->_forward('csrf-forbidden', 'error');
    return;
}

это работает очень хорошо для меня, но дважды проверьте настройки сеанса

» Внутри элемент хранит уникальный идентификатор, используя Zend_Session_Namespace, и проверяет его при отправке (проверяя, что срок действия TTL не истек) Затем используется «Идентичный» валидатор, чтобы убедиться, что переданный хэш соответствует сохраненному хешу. Помощник вида formHidden используется для визуализации элемента в форме. " Форма ZF документы

1 голос
/ 14 августа 2012

Zend_Form_Element_Hash должен регенерировать каждый запрос. То, что вы описываете, это ваши токены не синхронизированы. Обычно это происходит с несколькими формами или с перенаправлениями / пересылками.

Если вы используете ajax где-то на странице, вы можете поместить это в действие контроллера (ближе к концу)

$ форма-> hash-> initCsrfToken ();

$ this-> view-> hash = $ form-> hash-> getValue ();

Затем, когда вы делаете вызов ajax, просто вытяните токен и замените токен в форме, используя селектор и .replaceWith (). Это то, как вы имеете дело с несколькими формами

В противном случае вы, вероятно, либо перенаправляете что-то, либо загружаете что-то дважды, и вам следует изменить прыжок в библиотеке Zend. Хоп - это то, сколько раз токен может быть запрошен до истечения срока его действия

0 голосов
/ 02 марта 2010

Убедитесь, что в вашем скрипте нет скрытого перенаправления или пересылки ... хэш имеет счетчик прыжков, равный 1, поэтому при любом перенаправлении истекает его.

FWIW Я думаю, что в хэше несколько версий ZF была небольшая ошибка. Я застрял на той же самой проблеме и взломал код для подсчета количества переходов = 2. Когда я обновил ZF, эта проблема исчезла.

...