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

时间:2017-07-16 13:36:31

标签: php jquery ajax symfony csrf

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

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

另一个疑问是......如何使用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

但总是返回令牌有效。

1 个答案:

答案 0 :(得分:6)

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

正如@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>

然后,我这样做一个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) {


});

});

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

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

$isValidToken = $this->isCsrfTokenValid($townId, $token);

谢谢!