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

时间:2016-07-29 12:46:01

标签: php csrf symfony

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

  

您的系统上没有安装合适的C​​SPRNG

这是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核心或捆绑包,以免在每次更新时遇到麻烦。我根本不知道在哪里搞定。

1 个答案:

答案 0 :(得分:0)

如图所示here,您必须在配置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选项here,它应该做你想要的。