Zend Form - несколько форм на одной странице и (CSRF) проверки токенов - PullRequest
4 голосов
/ 13 июня 2011

Я использую Zend-Form для генерации моих форм в моем проекте.

Первое. Как вы обрабатываете несколько форм на одной странице и публикуете только отправленную форму?

Второе: когда у меня две формы на одной странице, токен будет проверять только самую верхнюю визуализированную форму в HTML. Вторая форма с ошибкой «получить токен не совпадает», что делает форму невозможной для публикации. Как вы даете каждой форме уникальный токен, который не конфликтует с другими?

С уважением, почему

Ответы [ 4 ]

6 голосов
/ 14 июня 2011

Когда у меня есть две формы на одной странице, токен будет проверять только самую верхнюю отображаемую форму в HTML.Вторая форма с ошибкой «получить токен не совпадает», что делает форму невозможной для публикации.Как вы даете каждой форме уникальный токен, который не конфликтует с другими?

Токены в нескольких формах невозможны в текущей реализации (см. initCsrfValidator).

Я предлагаю вам создать свой собственный токен, сохранить его в сеансе (с идентификатором формы) и проверить его самостоятельно.

3 голосов
/ 17 октября 2011

Я нашел этот вопрос, пытаясь создать две формы на одной странице, используя Zend_Form_Element_Hash. Есть два способа сделать это, и оба упомянуты в документации :

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

Итак ...

  1. Используйте уникальное имя для каждого Hash элемента
  2. Используйте уникальное значение соли для каждого Hash элемента
0 голосов
/ 14 августа 2012

Я на самом деле только что исправил подобную проблему, когда создавал несколько копий одной формы с защитой csrf.Происходило то, что только последняя созданная форма имела правильный токен csrf.

Небрежный способ справиться с этим - изменить переход в библиотеке Zend (в файле Zend_Form_Element_Hash), чтобы токены неистекает после 1 обновления или загрузки страницы.Это действительно простой способ решить проблему, но он работает, только если вы знаете, сколько раз страница будет загружаться.Это полосное решение

ПРАВИЛЬНЫЙ способ сделать это, когда страница загружена, сделать ajax-вызов, чтобы получить новый обновленный токен.Затем используйте вашу библиотеку javascript (jquery, вероятно, самый простой) и найдите ВСЕ экземпляры токена и замените их все на новый.

Итак, с точки зрения кода это будет выглядеть так: Контроллер:

$ form-> hash-> initCsrfToken ();

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

В вашем js-файле (если вы используете jquery)

$ (. Hash) .replaceWith ('HiddenHtmlPart1'. = Hash. 'HiddenHtmlPart2');Важной частью для селектора является выбор ВСЕХ скрытых элементов.Тогда вам просто нужно заменить внутреннюю часть скрытого элемента.Та же идея применима и к другим библиотекам js, хотя она предполагает использование других методов.

0 голосов
/ 15 сентября 2011

Я сталкиваюсь с той же ситуацией, что и

Когда у меня есть две формы на одной странице, токен будет проверять только самую верхнюю визуализированную форму в HTML.Вторая форма с ошибкой «получить токен не совпадает», что делает форму невозможной для публикации.Как вы даете каждой форме уникальный токен, который не конфликтует с другими?

Возможное решение состоит в том, чтобы иметь отдельную форму только для генерации и проверки токена.Затем в HTML каждая форма имеет свой собственный элемент токена, но с теми же значениями.Если вы отправляете одну форму, проверьте этот элемент токена с формой, которую вы использовали для ее создания.Если вы используете сочетание формы ajax и классической формы POST, вы можете отправить новый токен в ответе и назначить его каждому элементу токена.

//Finally set the response token
    $form->getElement('token')->render();   //Need to call render in order to regenerate the token
    $response['token'] = $form->getElement('token')->getValue();
    $this->_helper->json($response);

А в jquery вы можете получить что-токак $ ('._ token'). val (response.token)

На самом деле это довольно просто и даже лучше, чем добавление Zend_Form_Element_Hash к каждой форме.

...