我们在安装了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核心或捆绑包,以免在每次更新时遇到麻烦。我根本不知道在哪里搞定。
答案 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,它应该做你想要的。