即使使用无效值,ZF2表单的CSRF也会生效

时间:2014-11-28 02:46:16

标签: php forms validation zend-framework2 csrf

我有几种使用CSRF输入的表单。例如,在我的表单的构造函数中,它看起来像这样:

    $this->add(array (
        'name' => 'csrf',
        'type' => 'Csrf',
        'attributes' => array(
            'id' => 'csrf'
        )
    ));

只是为了踢,我尝试使用Firebug来更改CSRF输入的令牌值并提交表单,只是为了看看会发生什么。结果:它仍然有效。我甚至转储$ _POST数据以确认提交了无效令牌。更重要的是,我尝试将超时设置为10秒,同样的事情发生了:表单似乎忽略了CSRF输入并验证表单是否正常。代码如下:

    $this->add(array (
        'name' => 'csrf',
        'type' => 'Csrf',
        'attributes' => array(
            'id' => 'csrf'
        ),
        'options' => array(
            'csrf_options' => array(
                'timeout' => 10
            )
        )
    ));

我甚至尝试将CS​​RF元素的过滤器添加到表单的输入过滤器中,但同样,它仍然通过,它应该没有血腥。

我在这里做的其他事情我不是吗?如果它不能真正做任何事情,我不想将其添加到我的表单中。

编辑:这是我的表单代码和控制器操作的link。请注意,虽然表单方法getInputFilter具有csrf,sex和role的验证器,但没有它们的结果是相同的。

1 个答案:

答案 0 :(得分:4)

在阅读了文档之后,我不知何故偶然发现了让我思考的东西。所以我尝试将以下代码添加到getInputFilter方法:

$inputFilter->add($factory->createInput(
    array(
        'name' => 'csrf',
        'validators' => array (
            array(
                'name' => 'csrf'
            )
        )
)));

叫我疯了,但这是否意味着getInputFilter方法清除csrf,select和radio等元素上预先存在的验证器?