【发布时间】:2014-12-17 15:13:20
【问题描述】:
我有几种使用 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
)
)
));
我什至尝试将 CSRF 元素的过滤器添加到表单的输入过滤器中,但同样,它仍然通过了,当它不应该有的时候。
还有其他我不应该做的事情吗?如果它实际上不会做任何事情,我不想将它添加到我的表单中。
编辑:这是我的表单和控制器操作的代码的link。请注意,虽然表单的方法 getInputFilter 具有用于 csrf、sex 和角色的验证器,但没有它们的结果是相同的。
【问题讨论】:
-
这听起来很奇怪。您是否 100% 确定表格已通过验证?你可以检查你的控制器中的表单错误消息或使用 $form->getMessages() 查看文件吗?
-
这很奇怪。在浏览器中检查时,无论 csrf 值是什么,它都可以正常验证。在我的单元测试中也是如此:如果我在其中更改 csrf 值,它就会继续运行。
-
还有一些奇怪的事情:如果我为 Select 或 Radio 元素添加无效值,我的测试也会通过...
-
您是偶然使用 zf2 开发版本还是使用稳定版本?
-
您能否也将您的视图添加到 pastebin,我在您的控制器或表单和 InputFilter 中找不到任何内容。您可以尝试将 inputFilterSpecifications 移动到新文件
UserInputFilter并使用$form->setInputFilter(new UserFilter)将其设置到控制器中的表单上,或使用getServiceLocator()以检索过滤器。您还可以检查的是您的输入过滤器接收到的内容。看看$form->getInputFilter()->getRawValues()看看你的InputFilter收到了什么。
标签: php forms validation zend-framework2 csrf