28

Symfony 2 プロジェクトにいくつかの ajax 機能を実装しようとしています。jquery の $.post を使用して、コントローラーにデータを送り返したいと考えています。ただし、symfony の csrf 保護はフォームにのみ適用されるように見えるため、データを POST しただけでは CSRF 保護は行われません。

これを実装するための非常に簡単な方法は何でしょうか?

フォームを使用する場合、$form->isValid() を実行するだけで、CSRF トークンが通過するかどうかを確認できます。現在、投稿したいものをすべてフォームに入れて投稿しています。これは基本的に、そのフォームを使用してCSRF保護を実装しているだけであることを意味しますが、これはハックのようです.

4

4 に答える 4

27

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

この質問はあなたに役立つかもしれません

于 2012-08-21T12:20:46.073 に答える
1

このスニペットを試してみてください。Symfony フォームは、ポスト リクエストで送信する特別な _csrf_token を生成する必要があります。この値がないと、セキュリティ アラートが発生します。

もちろん、#targetForm はフォーム ID に、/endpoint はターゲット ajax URL に置き換える必要があります。

$('#targetForm').bind('submit', function(e) {

    e.preventDefault();
    var data = $(this).serialize();

    $.post('/endpoint', data, function(data) {
        // some logic here
    });

});
于 2012-08-21T12:12:41.173 に答える