如何使用Zend_Form_Element哈希?

时间:2009-10-26 22:36:46

标签: zend-framework csrf

然后我尝试使用Zend_Form_Element_Hash,它会在每次请求时重新生成一个哈希值。

在我的代码中:

 // form
 $this->addElement('hash', 'hihacker', array('salt' => 'thesal'));

然后我转储$ _SESSION我看到每个页面重新加载的新值。

然后我发送一个报告错误的表格“令牌'28a5e0e2a50a3d4afaa654468fd29420'与给定的令牌'a64407cc11376dac1916d2101de90d29'”不匹配,每次都是新的一对令牌

3 个答案:

答案 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时,这个问题就消失了。