2011-06-13 100 views
4

我使用Zend-Form在我的项目中生成我的表单。Zend表单 - 一个页面中的多个表单和(CSRF)令牌验证

第一:如何处理同一页面上的多个表单,并且只发布提交的表单?

第二:当我在同一页上有两个表单时,令牌只会验证HTML中最顶层的呈现表单。第二种形式获得“令牌不匹配”错误,从而使表单无法发布。你如何给每个表单一个与其他表单不冲突的唯一标记?

真诚的,为什么

+0

http://stackoverflow.com/questions/1170857/zend-form-multiple-forms-on-same-page – 2011-06-13 11:09:52

+0

解决第一个问题。第二个问题呢? – why 2011-06-13 11:13:27

+0

你为每个表单呈现了一个csrf字段吗? – martynthewolf 2011-06-13 12:02:44

回答

6

当我有在同一页上两种形式的代币只验证HTML中最顶层的呈现形式。第二种形式获得“令牌不匹配”错误,从而使表单无法发布。你如何给每个表单一个与其他表单不冲突的唯一标记?

令牌上的多个形式是不可能的当前implementation(见initCsrfValidator)。

我建议您生成自己的令牌,将其存储在会话中(使用表单ID)并自行验证。

+0

我以为你可以使用散列做多个表单,只要他们有不同的会话对象来存储它们的散列呢?看起来如果你给它们不同的名字会发生什么,因为会话名称空间使用对象名称。 – 2011-06-24 12:21:58

0

我遇到的

同样的情况时,我有同一个页面上有两种形式的代币只验证 在HTML最顶端的呈现形式。第二种形式获得 “令牌不匹配”错误,从而使表单无法发布。 如何给每个表单一个与其他 不冲突的唯一标记?

一个可能的解决方案是只有一个单独的表单用于令牌生成和验证。然后在HTML中,每个表单都有自己的标记元素,但具有相同的值。如果您提交了一个表单,然后使用您用于生成该表单的表单来验证此标记元素。如果您使用的是混合使用ajax表单和传统的POST表单,则可以在响应中发送新令牌并将其分配给每个令牌元素。

//Finally set the response token 
    $form->getElement('token')->render(); //Need to call render in order to regenerate the token 
    $response['token'] = $form->getElement('token')->getValue(); 
    $this->_helper->json($response); 

而且在jQuery的你可以有像$(“._令牌”)。VAL(response.token)

其实,这是很容易的,比拥有一个Zend_Form_Element_Hash添加到每个更棒形成。

3

我在使用Zend_Form_Element_Hash试图在同一页上使用两种表单时发现此问题。有两种方法可以完成此操作,它们都是mentioned in the documentation

散列元素的名称应该是唯一的。我们推荐使用元素的盐选项 - 两个具有相同名称和不同盐的哈希不会相互碰撞

因此...

  1. 每个Hash元素
  2. 使用
0

我其实只是固定的我在那里产生相同形式的多个副本类似的问题对每个Hash元素的独特的盐值使用唯一名称csrf保护。发生的事情是只有最后创建的表单才具有正确的csrf标记。

处理此问题的草率方法是更改​​Zend库(位于Zend_Form_Element_Hash文件中)中的跳跃,以便令牌在1次刷新或页面加载后不会过期。这是解决问题的一种非常简单的方法,但只有在知道页面加载的次数时才有效。这是蟒蛇解决方案

正确的方法来做到这一点是一旦页面加载做一个Ajax调用来获得一个新的刷新令牌。然后使用你的JavaScript库(jquery可能是最简单的),并找到令牌的所有实例,并用新的代替全部。

所以在代码方面,它应该是这样的: 控制器:

$形式 - >散列> initCsrfToken(); $ this-> view-> hash = $ form-> hash-> getValue(); $ this-> hash-> getValue();

在你的js文件(如果你使用jQuery)

$ .replaceWith(哈希值。)( 'HiddenHtmlPart1'=散 'HiddenHtmlPart2'); 重要的部分是让选择器选择所有隐藏的元素。然后你只需要替换隐藏元素的内部。同样的想法适用于其他js库,尽管它涉及不同的方法。