2017-07-16 47 views
3

我正在開發一個網站,你可以'添加朋友'另一個用戶,就像Facebook一樣。現在,我把一個鏈接,當你點擊它,一個AJAX調用完成。如何將CSRF保護添加到Symfony3上的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

但總是返回令牌是有效。

+0

將表單創建爲正常的Symfony表單,然後將其加載到您的模板中並通過ajax發送表單。它將像任何其他Symfony表格一樣擁有CSRF令牌 –

+1

謝謝,但在我看來,對於創建沒有表單元素的表單來說,這似乎是一種不好的做法。 –

+0

它將有一個元素 - CSRF令牌。它可能會有其他隱藏的領域。這並不是不好的做法,它正在按照預期的方式使用Symfony框架 –

回答

4

最後我找到了解決我的問題的方法。

由於@yceruto評論,可以生成一個csrf token沒有任何形式的,看到這一點:http://symfony.com/doc/current/reference/twig_reference.html#csrf-token

有了這個,我可以通過以下方式創建我的嫩枝鏈接:

<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); 

謝謝!

+0

'$ townId'是什麼?那會不會是用來生成令牌的用戶ID? – Chris

+1

@Chris我不知道他爲什麼添加'$ townId',你只需要添加令牌的標識符作爲函數的第一個參數。所以如果你像這樣'csrf_token('foobar')'創建你的令牌,那麼你可以檢查它的有效性:'$ this-> isCsrfTokenValid('foobar',$ token)' – phpheini

+1

對不起@Chris,我添加了對象ID因爲我有一個對象列表,所以我想爲每個對象設置不同的標記......這只是爲了提高安全性。 –