如何为表单生成新的Csrf-Token

时间:2013-08-16 11:32:19

标签: zend-framework2 zend-form csrf

我得到了一份表格。当我更改该Form中的Select-Element时,我对同一个URL进行Ajax调用,这基本上会加载一个新的Form,其中包含一些额外的Fields或删除了一些Fields(不同的Categories,不同的Fields ......)。 / p>

现在,我从请求中获得的表单显然将具有SAME Csrf-Token,因为令牌只存在于一个请求中。意思是,每当我做这种动作时,我都必须生成一个新的令牌,但我真的不知道如何做到这一点。

我的假设是我必须做类似

的事情
if ($request->isXmlHttpRequest()) {
    $form->get('csrf')    ->regenerateCsrfToken()
}

但显然这个功能不存在,但它应该是那些线条相似的东西。任何输入将不胜感激

2 个答案:

答案 0 :(得分:4)

你试过这个:

if ($request->isXmlHttpRequest()) {
    $form->get('csrf')->getCsrfValidator()->getHash(true);
}

getHash(true)将重新生成哈希值,并将更改后的哈希值存储在生成器中,这样您的表单将在以后从元素中检索时检索新值。

答案 1 :(得分:1)

@MichaelGooden的答案绝对正确。这是解决问题的一般方法。然而,在我所做的内容中,还有另一个错误,也可能与其他用户相关。我的select.onChange()方法是:

  • 保存表单数据
  • 获取新表单(GET / item / add / categoryId)
  • 重新填充相同的表单字段

这样做,我也意外地保存了CSRF-Token,并将存储的令牌重新填充为新的令牌。显然这不起作用。因此,在我的form.rePopulate(data)函数中,我只是排除了CSRF元素,就是它,所有这些都像魅力一样。