2017-07-16 1 views
3

Facebookのように別のユーザーを「友達を追加」できるWebを開発しています。今のところ、リンクを貼り付けてクリックすると、AJAX呼び出しが行われます。Symfony3でAJAXコールにCSRF保護を追加する方法は?

新しい友情を維持する前に、リクエストがAjaxであるかどうかを確認しますが、さらに進んでセキュリティを強化したいと考えています。ページは10以上のリンク(ポーズ可能なリクエスト)を持つことができるので、... 1つのトークン、またはリンクごとのトークンが必要かどうかわかりません。

もう1つ疑わしいです... symfonyを使用してトークンを生成し、有効かどうかをチェックする方法はありますか?最初のコントローラーでのトークンの生成方法と、(ajax呼び出しを受け取る)addFriendコントローラーでの検証方法に焦点を当てました。

私はトークンを生成するためにこれを使用してみました:

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

最後に、私の問題の回避策が見つかりました。その後

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

:私は次のようにTWIGの私のリンクを作成することができ、これによりhttp://symfony.com/doc/current/reference/twig_reference.html#csrf-token

:@ycerutoがコメントしたよう

が、これを見る、任意のフォームなしcsrf tokenを生成することが可能です、私はこのようなAJAX呼び出しを実行します。トークンは、次のコードを使用してcontollerで有効であるかどうかを

$('.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を追加しました私はオブジェクトのリストを持っているので、オブジェクトごとに異なるトークンを持たせたいのです...セキュリティを改善することだけです。 –