然后我尝试使用Zend_Form_Element_Hash,它会在每次请求时重新生成一个哈希值。
在我的代码中:
// form
$this->addElement('hash', 'hihacker', array('salt' => 'thesal'));
然后我转储$ _SESSION我看到每个页面重新加载的新值。
然后我发送一个报告错误的表格“令牌'28a5e0e2a50a3d4afaa654468fd29420'与给定的令牌'a64407cc11376dac1916d2101de90d29'”不匹配,每次都是新的一对令牌
答案 0 :(得分:5)
$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是否已过期)。然后使用'Identical'验证器确保提交的散列与存储的散列匹配。 'formHidden'视图助手用于渲染表单中的元素。 “ form ZF docs
答案 1 :(得分:1)
Zend_Form_Element_Hash应该重新生成每个请求。你所描述的是你的标记不同步。这通常发生在多个表单或重定向/转发。
如果你在页面的某个地方使用ajax,你可以把它放在控制器动作中(接近结尾)
$形式 - >散列> initCsrfToken();
$ this-> view-> hash = $ form-> hash-> getValue();
然后当你执行ajax调用时,只需拉动令牌并使用选择器和.replaceWith()替换表单上的令牌。这也是你处理多种形式的方式
否则,您可能要么重定向某些内容,要么加载两次,您应该更改Zend库中的跃点。跃点是令牌到期前可以请求的次数
答案 2 :(得分:0)
检查脚本中是否存在隐藏的重定向或转发......散列的跳数为1,因此任何重定向都会使其过期。
FWIW我认为在几个版本的ZF之前哈希中存在一个微妙的错误。我遇到了完全相同的问题,并且破解了代码以使跳数= 2.当我升级ZF时,这个问题就消失了。