如何在Symfony3上为AJAX调用添加CSRF保护?

Isa*_*sca 7 php ajax jquery csrf symfony

我正在开发一个网站,你可以"添加朋友"另一个用户,比如facebook.现在,我放了一个链接,当你点击它时,就完成了一个AJAX调用.

在坚持新的友谊之前,我检查请求是否是Ajax,但我想进一步增加安全性.一个页面可以有超过10个链接(posible请求),所以...我不知道我是否只需要一个令牌,或每个链接一个令牌.

另一个疑问是....如何使用Symfony生成令牌并检查是否有效?重点关注如何在初始控制器上生成令牌,然后,如何在addFriend控制器(接收ajax调用)上进行验证.

我试图用它来生成一个令牌:

http://api.symfony.com/3.1/Symfony/Component/Security/Csrf/TokenGenerator/TokenGeneratorInterface.html

然后这要检查令牌:

https://symfony.com/doc/current/controller/csrf_token_validation.html

但总是返回该令牌是不是有效.

Isa*_*sca 7

最后,我找到了解决问题的方法.

正如@yceruto评论的那样,可以生成一个csrf token没有任何形式的内容,请看:http://symfony.com/doc/current/reference/twig_reference.html#csrf-token

有了这个,我可以通过以下方式在TWIG上创建我的链接:

<a data-id="{{ user.id }}" class="card-link clickable sendFriendRequest" data-token="{{ csrf_token(user.id) }}">ADD_FRIEND</a>
Run Code Online (Sandbox Code Playgroud)

然后,我这样做一个AJAX调用:

$('.elementsList').on('click','.sendFriendRequest', function () {

var userId = $(this).data('id');
var token = $(this).data('token');

$.post('/users/sendFriendRequest/'+userId, {token: token}
).done(function (response) {
    //Some code here

}).fail(function (response) {


});

});
Run Code Online (Sandbox Code Playgroud)

最后,使用以下代码检查令牌在控制器上是否有效:

$token = $request->request->get('token');

$isValidToken = $this->isCsrfTokenValid($townId, $token);
Run Code Online (Sandbox Code Playgroud)

谢谢!