3

然后我尝试使用 Zend_Form_Element_Hash 它为每个请求重新生成一个散列。

在我的代码中:

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

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

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

4

3 回答 3

6
$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

于 2009-10-29T18:49:24.167 回答
1

Zend_Form_Element_Hash 应该重新生成每个请求。您所描述的是您的令牌不同步。这通常发生在多种形式或重定向/转发中。

如果您在页面上的某处使用 ajax,您可以将其放在控制器操作中(接近尾声)

$form->hash->initCsrfToken();

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

然后,当您进行 ajax 调用时,只需拉取令牌并使用选择器和 .replaceWith() 替换表单上的令牌。这也是您处理多种表格的方式

否则,您可能会重定向某些内容或加载某些内容两次,您应该更改 Zend 库中的跃点。跃点是令牌过期前可以请求多少次

于 2012-08-14T04:31:25.967 回答
0

检查脚本中某处是否没有隐藏的重定向或转发...哈希的跳数为 1,因此任何重定向都会使其过期。

FWIW 我认为在 ZF 的几个版本之前的哈希中有一个微妙的错误。我遇到了完全相同的问题,并修改了代码以使跳数 = 2。当我升级 ZF 时,这个问题就消失了。

于 2010-03-02T07:28:56.090 回答