我正在关注此示例教程
项目代码:http://akrabat.com/wp-content/uploads/zf-tutorial-layoutform.zip
教程:http://akrabat.com/zend-framework/a-form-in-your-layout/
项目代码按预期运行,直到我向表单添加哈希元素。我所做的只是在application / forms / Signup.php
下的表单中添加此代码$hash = new Zend_Form_Element_Hash('hash');
$hash->setSalt('mysalt');
$this->addElement($hash);
这些额外的代码会抛弃一切。当我现在提交表单时,它会给我2个令牌不匹配的错误。
一些故障排除:
这是我在Zend的专业水平上可以想到的故障排除程度。所以认为是时候问大脑了。我希望有人能搞清楚。
答案 0 :(得分:2)
即使您已将哈希元素添加到表单中,它仍然适用于您?如果是这样,请上传您的项目并作为单独的答案发布。
我所做的就是添加您发布的代码并且工作正常。你在哪里使用这段代码?这听起来像是与你的环境有关吗?
答案 1 :(得分:0)
此元素提供对表单上的CSRF攻击的保护,确保数据由生成表单的用户会话提交,而不是由流氓脚本提交。通过向表单添加哈希元素并在提交表单时验证它来实现保护。
哈希元素的名称应该是唯一的。我们建议对元素使用salt选项 - 具有相同名称和不同盐的两个哈希不会发生冲突:
$form->addElement('hash', 'no_csrf_foo', array('salt' => 'unique'));
您可以稍后使用setSalt($ salt)方法设置salt。
在内部,元素使用Zend_Session_Namespace存储唯一标识符,并在提交时检查它(检查TTL是否已过期)。然后使用'Identical'验证器确保提交的散列与存储的散列匹配。
'formHidden'视图助手用于渲染表单中的元素。
我会尝试:
$form->addElement('hash', 'unique_form_name', array('salt' => 'unique_salt'));
我在代码中没有看到唯一的表单/哈希名称,这就是为什么令牌不是马赫。