我有几种使用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和role的验证器,但没有它们的结果是相同的。
答案 0 :(得分:4)
在阅读了文档之后,我不知何故偶然发现了让我思考的东西。所以我尝试将以下代码添加到getInputFilter方法:
$inputFilter->add($factory->createInput(
array(
'name' => 'csrf',
'validators' => array (
array(
'name' => 'csrf'
)
)
)));
叫我疯了,但这是否意味着getInputFilter方法清除csrf,select和radio等元素上预先存在的验证器?