Zend Framework 2 CSRF 验证

Posted

技术标签:

【中文标题】Zend Framework 2 CSRF 验证【英文标题】:Zend Framework 2 CSRF validation 【发布时间】:2017-07-09 11:54:09 【问题描述】:

我有基于 Zend 框架 2 的应用程序。我有一个带有 CSRF 字段的表单。如果我填写表格并在大约 5 分钟后提交,它会给我The form submitted did not originate from the expected site 验证错误。

所以我认为这可能是会话配置的一些问题。然后我在module.config.php 上将SessionConfig 的选项添加为follows

'session' => array(
    'remember_me_seconds' => 2419200,
    'use_cookies' => true,
    'cookie_httponly' => true,
    'cookie_lifetime' => '2419200',
    'gc_maxlifetime' => '2419200'
),

但问题依然存在。你知道如何解决这个问题吗?

--更新--

我的表单类包含如下CSRF元素,

    $this->add(array(
        'type' => 'Zend\Form\Element\Csrf',
        'name' => 'security',
        'options' => array(
            'csrf_options' => array(
                'timeout' => 20000
            )
        )
    ));

这些似乎都不起作用。

【问题讨论】:

【参考方案1】:

ZendFramework 下的 Csrf 系统根据 timeout 键下 Csrf 元素的配置中存储的参数配置会话持续时间,如下例所示:

$form->add([
    'type' => Element\Csrf::class,
    'name' => 'csrf',
    'options' => [
        'csrf_options' => [
            'timeout' => 600,
        ],
    ],
]);

将会话配置放在config 键下,如下例所示:

'session' => [
    'config' => [
        'class'   => Zend\Session\Config\SessionConfig::class,
        'options' => [
            'name'                => 'SID',
            'use_cookies'         => true,
            'cookie_httponly'     => true,
            'remember_me_seconds' => 2419200,
        ],
    ],
]

【讨论】:

事实上我已经这样做了。我会更新这个问题。即使超时,它也有问题。

以上是关于Zend Framework 2 CSRF 验证的主要内容,如果未能解决你的问题,请参考以下文章

文件上传表单的 Zend 验证器大小 - Zend Framework 2.3

Zend Form - 一页中的多个表单和(CSRF)令牌验证

markdown Zend Framework 3:身份验证

PHP Zend Framework - 验证器示例

Zend Framework 3 BaseInputFilter :: setData()抛出InvalidArgumentException

Zend Framework 表单、装饰器和验证:我应该回到纯 HTML 吗?