Symfony-CSRF令牌的随机生成器会产生错误


Symfony - Random generator for the CSRF-token creates error

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

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

这与随机Compat丛有关。似乎/dev/urandom不可用。


我们仍然希望用CSRF令牌来保护我们的表格,他们甚至提供了一个后备方案:

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

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

如图所示,在配置CSRF保护时,您必须提供一个令牌生成器:

# 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选项,它应该可以满足您的要求。