当我向表单添加哈希时,为什么这个zend示例停止工作

时间:2011-01-13 22:39:33

标签: php zend-framework zend-form

我正在关注此示例教程

项目代码: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_Form_Element_Hash并将跳数从1更改为100时,我仍然遇到同样的错误。

这是我在Zend的专业水平上可以想到的故障排除程度。所以认为是时候问大脑了。我希望有人能搞清楚。

2 个答案:

答案 0 :(得分:2)

即使您已将哈希元素添加到表单中,它仍然适用于您?如果是这样,请上传您的项目并作为单独的答案发布。

我所做的就是添加您发布的代码并且工作正常。你在哪里使用这段代码?这听起来像是与你的环境有关吗?

答案 1 :(得分:0)

来自:Zend_Form_Element_Hash

此元素提供对表单上的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'));

我在代码中没有看到唯一的表单/哈希名称,这就是为什么令牌不是马赫。