我想实现我的Symfony 2项目的一些Ajax功能。 使用jQuery的$。员额我希望将一些数据发送回我的控制器。 然而,当我只是张贴了数据没有CSRF保护很到位,因为symfony的CSRF保护似乎只适用于形式。
什么是实现这个一个非常简单的方法是什么?
当使用表单我可以做$形式 - > isValid()的找出CSRF令牌是否通过。 我现在把我的一切要发布的形式,然后张贴的。 这基本上意味着我只使用这种形式来实现CSRF保护,这似乎哈克。
我想实现我的Symfony 2项目的一些Ajax功能。 使用jQuery的$。员额我希望将一些数据发送回我的控制器。 然而,当我只是张贴了数据没有CSRF保护很到位,因为symfony的CSRF保护似乎只适用于形式。
什么是实现这个一个非常简单的方法是什么?
当使用表单我可以做$形式 - > isValid()的找出CSRF令牌是否通过。 我现在把我的一切要发布的形式,然后张贴的。 这基本上意味着我只使用这种形式来实现CSRF保护,这似乎哈克。
在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);
这个问题可能对您有用
我有这个问题,间歇性。 原来这不是由于我的AJAX,但因为Silex的给你一个过时DefaultCsrfProvider
它使用会话ID本身作为标记的一部分,我随意改变ID的安全性。 取而代之的是,明确地告诉它使用新的CsrfTokenManager
修复它,因为这一个生成会话令牌,并将其存储,使得会话ID可以改变,而不会影响令牌的有效性。
/** Use a CSRF provider that does not depend on the session ID being constant. We change the session ID randomly */
$app['form.csrf_provider'] = $app->share(function ($app) {
$storage = new Symfony\Component\Security\Csrf\TokenStorage\SessionTokenStorage($app['session']);
return new Symfony\Component\Security\Csrf\CsrfTokenManager(null, $storage);
});
你应该试试这个片段。 Symfony的形式应该产生,应与POST请求被发送特殊_csrf_token。 没有这个值安全警报将提高。
当然#targetForm应当由格式ID和/端点换成目标AJAX网址
$('#targetForm').bind('submit', function(e) {
e.preventDefault();
var data = $(this).serialize();
$.post('/endpoint', data, function(data) {
// some logic here
});
});