Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php ZF2表格';s CSRF即使使用无效值也会进行验证_Php_Forms_Validation_Zend Framework2_Csrf - Fatal编程技术网

Php ZF2表格';s CSRF即使使用无效值也会进行验证

Php ZF2表格';s CSRF即使使用无效值也会进行验证,php,forms,validation,zend-framework2,csrf,Php,Forms,Validation,Zend Framework2,Csrf,我有几种使用CSRF输入的表单。例如,在我表单的构造函数中,它如下所示: $this->add(array ( 'name' => 'csrf', 'type' => 'Csrf', 'attributes' => array( 'id' => 'csrf' ) )); 为了好玩,我尝试使用Firebug更改CSRF输入的令牌值并提交表单,只是为了看看会发生什么

我有几种使用CSRF输入的表单。例如,在我表单的构造函数中,它如下所示:

    $this->add(array (
        'name' => 'csrf',
        'type' => 'Csrf',
        'attributes' => array(
            'id' => 'csrf'
        )
    ));
为了好玩,我尝试使用Firebug更改CSRF输入的令牌值并提交表单,只是为了看看会发生什么。结果:它仍然有效。我甚至转储了$u POST数据,以确认提交的令牌无效。此外,我尝试将超时设置为10秒,但同样的事情发生了:表单似乎忽略了CSRF输入,并验证表单是否正常。代码如下:

    $this->add(array (
        'name' => 'csrf',
        'type' => 'Csrf',
        'attributes' => array(
            'id' => 'csrf'
        ),
        'options' => array(
            'csrf_options' => array(
                'timeout' => 10
            )
        )
    ));
我甚至尝试为CSRF元素添加一个过滤器到表单的输入过滤器中,但同样,当它不应该通过时,它仍然通过了

还有什么我不应该在这里做的吗?我不想把它添加到我的表单中,如果它实际上没有任何作用的话


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

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

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

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

听起来很奇怪。您是否100%确定表单已验证?你能在你的控制器中检查表单错误消息吗?或者用$form->getMessages()查看文件吗?这很奇怪。在浏览器中进行检查时,无论csrf值是多少,它都会正常进行验证。在我的单元测试中也是如此:如果我修改了其中的csrf值,它就会顺利通过。还有一件奇怪的事情:如果我为Select或Radio元素添加无效值,我的测试也会通过……你是碰巧使用了zf2开发版本还是使用了稳定版本?你能将视图也添加到pastebin中吗,我在您的控制器或窗体和InputFilter中找不到任何内容。您可以尝试将inputFilterSpecifications移动到一个新文件
UserInputFilter
,并使用
$form->setInputFilter(new UserFilter)
将其设置到控制器内的表单上,或者使用
getServiceLocator()
检索该筛选器。您还可以检查inputfilter接收的内容。查看
$form->getInputFilter()->getRawValues()
以查看您的
InputFilter
收到了什么。您在回答中找到您所问问题的答案了吗?我有相同的问题否。再说一次,我真的没有看。现在,我刚刚手动设置了验证器,它工作得很好