Почему этот Zend-пример перестает работать, когда я добавляю хеш в форму - PullRequest
5 голосов
/ 14 января 2011

Я следую этому учебному примеру

код проекта: http://akrabat.com/wp-content/uploads/zf-tutorial-layoutform.zip

учебник: http://akrabat.com/zend-framework/a-form-in-your-layout/

Код проекта выполняется должным образом, пока я не добавлю элемент хеша в форму. Все, что я делаю, это добавляю этот код в форму под application / forms / Registration.php

$hash = new Zend_Form_Element_Hash('hash');
$hash->setSalt('mysalt');
$this->addElement($hash);

Этот дополнительный бит кода отбрасывает все. Когда я отправляю форму сейчас, она выдает ошибку, что 2 токена не совпадают.

Устранение некоторых неполадок:

  • Проблема не в самом хэше, потому что он отлично работает в других моих примерах.
  • Я думаю, что это связано с обработкой запроса в этом примере, но я не уверен, в чем именно проблема. Я думал, что это связано с количеством переходов, но когда я редактировал Zend_Form_Element_Hash и изменил счетчик переходов с 1 на 100, я все равно получил ту же ошибку.

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

Ответы [ 2 ]

2 голосов
/ 18 января 2011

Это работает для вас даже после того, как вы добавили элемент хеша в форму?Если да, не могли бы вы загрузить свой проект и опубликовать его в виде отдельного ответа.

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

0 голосов
/ 17 января 2011

From: Zend_Form_Element_Hash

Этот элемент обеспечивает защиту от CSRF-атак на формы, обеспечивая передачу данных сеансом пользователя, который сгенерировал форму, а не мошенническим сценарием.Защита достигается добавлением хеш-элемента в форму и проверкой его при отправке формы.

Имя хеш-элемента должно быть уникальным.Мы рекомендуем использовать параметр соли для элемента - два хэша с одинаковыми именами и разные соли не будут сталкиваться:

$form->addElement('hash', 'no_csrf_foo', array('salt' => 'unique'));

Вы можете установить соль позже, используя setSalt ($ salt)method.

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

Помощник вида formHidden используется для визуализации элемента в форме.

Я попробую:

$form->addElement('hash', 'unique_form_name', array('salt' => 'unique_salt'));

Я не вижу уникального имени формы / хэша в вашем коде, и поэтому токены не обрабатываются.

...