Как использовать Хеш Формы Платформы Зенда (маркер) с Ajax

Я включал Zend_Form_Element_Hash в форму multiplecheckbox форма. Мне установили jQuery для исчерпывания запроса Ajax, когда флажок нажат, я передаю маркер с этим запросом Ajax. Первый запрос Ajax работает отлично, но последующий сбой.

Я подозреваю, что это может быть, после того как маркер был проверен, это затем удалено из сессии (транзитный участок = 1).

Каков был бы Ваш план нападения для обеспечения формы с Хешем Платформы Зенда уже с помощью Ajax для завершения некоторых из этих запросов?

17
задан David Snabel-Caunt 21 March 2010 в 13:08
поделиться

4 ответа

В конце концов я отказался от использования Zend_Form_Element_Hash и просто создал токен вручную, зарегистрировал его в Zend_Session и затем проверил его при отправке.

form.php

$myNamespace = new Zend_Session_Namespace('authtoken');
$myNamespace->setExpirationSeconds(900);
$myNamespace->authtoken = $hash = md5(uniqid(rand(),1));
$auth = new Zend_Form_Element_Hidden('authtoken');
$auth->setValue($hash)
     ->setRequired('true')
     ->removeDecorator('HtmlTag')
     ->removeDecorator('Label');    

controller.php

$mysession = new Zend_Session_Namespace('authtoken');
$hash = $mysession->authtoken;
if($hash == $data['authtoken']){
    print "success";
} else {
    print "you fail";
}

Кажется, это работает и по-прежнему сохраняет относительную разумность и безопасность. Я бы по-прежнему предпочел использовать элемент Hash, но, похоже, я не могу заставить его работать с AJAX.

Спасибо всем.

9
ответ дан 30 November 2019 в 13:20
поделиться

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

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

2
ответ дан 30 November 2019 в 13:20
поделиться

Вы намекнули на правильный ответ в своем вопросе: увеличьте количество переходов.

Об этом конкретно упоминалось в онлайн-руководстве ZF, но они обновили свои руководства, и теперь я не могу его найти (усмехается) - иначе я бы разместил ссылку для вас.

1
ответ дан 30 November 2019 в 13:20
поделиться

Есть решение:

Создайте, помимо формы, которая будет содержать данные, форму без элементов. Из контроллера вы создаете экземпляры двух форм. Также в контроллере вы добавляете хэш элемента в пустую форму. Обе формы должны быть отправлены в видение. Затем в условии «if ($ request-> isXmlHttpRequest ())» в контроллере вы визуализируете пустую форму. Затем вы берете хеш-значение с помощью метода getValue (). Это значение должно быть отправлено в ответ Ajax, а затем использовать JavaScript для замены уже устаревшего хеш-значения. Возможность создать пустую форму для хэша состоит в том, чтобы избежать проблем с другими элементами, такими как капча, идентификатор которой будет снова сгенерирован, если форма будет визуализирована, а также потребуется заменить новую информацию. Проверка будет проводиться отдельно, потому что есть две разные формы. Позже вы можете повторно использовать хеш-форму (пустую), когда захотите. Ниже приведены примеры кода.

//In the controller, after instantiating the empty form you add the Hash element to it:
$hash = new Zend_Form_Element_Hash('no_csrf_foo');
$hash_form->addElement('hash', 'no_csrf_foo', array('salt' => 'unique'));

 //...

//Also in the controller, within the condition "if ($request->isXmlHttpRequest())" you render the form (this will renew the session for the next attempt to send the form) and get the new id value:
$hash_form->render($this->view);
$hash_value['hash'] = $hash_form->getElement('no_csrf_foo')->getValue();//The value must be added to the ajax response in JSON, for example. One can use the methods Zend_Json::decode($response) and Zend_Json::encode($array) for conversions between PHP array and JSON.

//---------------------------------------

//In JavaScript, the Ajax response function:
document.getElementById("no_csrf_foo").value = data.hash;//Retrieves the hash value from the Json response and set it to the hash input.

Лео

4
ответ дан 30 November 2019 в 13:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: