【问题标题】:Symfony - Random generator for the CSRF-token creates errorSymfony - CSRF 令牌的随机生成器会产生错误
【发布时间】:2016-07-30 20:18:59
【问题描述】:

我们在安装了 PHP 5.5.9 的服务器上运行 Syfmonfy 3.1.2 站点。一切正常,除了我们必须处理创建 CSRF 令牌的问题:

您的系统上没有安装合适的 CSPRNG

这是related 到Random Compat 捆绑包。 /dev/urandom 好像不可用了。


我们仍然希望使用 CSRF 令牌来保护我们的表单,他们甚至 provide a fallback:

try {
    $bytes = random_bytes(32);
} catch (Exception $ex) {
    $strong = false;
    $bytes = openssl_random_pseudo_bytes(32, $strong);
    if (!$strong) {
        throw $ex;
    }
}

现在,我该如何实现呢?我不想调整 Symfony 核心或捆绑包,以免在未来的每次更新中遇到麻烦。我根本不知道在哪里连接它。

【问题讨论】:

    标签: php csrf symfony


    【解决方案1】:

    如图here,配置CSRF保护的时候要给一个token生成器:

    # app/config/security.yml
    
    security:
        # ...
        firewalls:
            secured_area:
                # ...
                form_login:
                    # ...
                    csrf_token_generator: security.csrf.token_manager # <-here
    

    代替默认的security.csrf.token_manager 服务,提供您自己的令牌管理器。

    您的自定义 tokenManager 必须实现 CsrfTokenManagerInterface:

    use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
    

    将其声明为服务,然后您就应该完成了

    评论后更新

    要将 token_manager 提供给您的其他表单,您可以尝试在表单选项中指定它:

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            // csrf options
            'csrf_protection'    => true,
            'csrf_field_name'    => '_token',
            'csrf_token_id'      => 'task_item',
            'csrf_token_manager' => 'YourBundle\Path\To\YourCustomCsrfTokenManager'
            // other ones...
        ));
    }
    

    我在文档中没有找到任何内容,但是查看 Symfony 的源代码我发现了 csrf_token_manager 选项 here,它应该可以满足您的需求。

    【讨论】:

    • 感谢您的意见。我还认为在这种情况下我可以编写自己的令牌生成器。您展示的示例解释了如何将令牌生成器添加到登录表单。但是如何为所有其他形式提供令牌生成器?我在配置文件中找不到任何位置。
    猜你喜欢
    • 2016-04-25
    • 2020-08-08
    • 1970-01-01
    • 2011-08-16
    • 2010-12-20
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    相关资源
    最近更新 更多