Я включал Zend_Form_Element_Hash в форму multiplecheckbox форма. Мне установили jQuery для исчерпывания запроса Ajax, когда флажок нажат, я передаю маркер с этим запросом Ajax. Первый запрос Ajax работает отлично, но последующий сбой.
Я подозреваю, что это может быть, после того как маркер был проверен, это затем удалено из сессии (транзитный участок = 1).
Каков был бы Ваш план нападения для обеспечения формы с Хешем Платформы Зенда уже с помощью Ajax для завершения некоторых из этих запросов?
В конце концов я отказался от использования 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.
Спасибо всем.
Хеш-коды форм - это великолепно в принципе, но на практике они могут стать настоящим кошмаром. Я думаю, что лучший способ справиться с этим - вернуть новый хэш с ответом, когда вы делаете запрос, и обновить разметку формы или сохранить в памяти для вашего javascript по мере необходимости.
Новый хэш может быть доступен из объекта формы, или вы можете прочитать его из сеанса.
Вы намекнули на правильный ответ в своем вопросе: увеличьте количество переходов.
Об этом конкретно упоминалось в онлайн-руководстве ZF, но они обновили свои руководства, и теперь я не могу его найти (усмехается) - иначе я бы разместил ссылку для вас.
Есть решение:
Создайте, помимо формы, которая будет содержать данные, форму без элементов. Из контроллера вы создаете экземпляры двух форм. Также в контроллере вы добавляете хэш элемента в пустую форму. Обе формы должны быть отправлены в видение. Затем в условии «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.
Лео