Symfony CSRF和Ajax

pet*_*rus 27 ajax csrf symfony

我试图在我的Symfony 2项目中实现一些ajax功能.使用jquery的$ .post我想将一些数据发送回我的控制器.但是,当我只发布数据时,没有CSRF保护,因为symfony的csrf保护似乎只适用于表单.

实现这个目的的方法是什么?

使用表单时,我可以只使用$ form-> isValid()来查明CSRF令牌是否通过.我目前正在将所有想要POST的内容放在一个表单中然后发布.这基本上意味着我只使用该表单来实现CSRF保护,这似乎是hacky.

Vit*_*ian 27

在Symfony2中,CSRF令牌默认基于会话.如果你想生成它,你只需要获得这个服务和调用生成方法:

//Symfony\Component\Form\Extension\Csrf\CsrfProvider\SessionCsrfProvider by default
$csrf = $this->get('form.csrf_provider');
//Intention should be empty string, if you did not define it in parameters
$token = $csrf->generateCsrfToken($intention); 

return new Response($token);
Run Code Online (Sandbox Code Playgroud)

这个问题可能对您有用

  • 对于嵌入令牌:设置X-CSRF-Token标头似乎是一个简洁的解决方案:http://erlend.oftedal.no/blog/?blogid = 118 (6认同)
  • 好吧,这解决了问题的一半.现在我需要验证POST'ed令牌,我会这样做:http://api.symfony.com/2.0/Symfony/Component/Form/Extension/Csrf/CsrfProvider/SessionCsrfProvider.html#method_isCsrfTokenValid (2认同)
  • 该服务的名称在Symfony 3中更改为“ security.csrf.token_manager”。接口也已更改。您需要调用`getToken()`而不是`generateCsrfToken()`。 (2认同)