21

Symfony2アプリケーションの使用中にユーザーがバックグラウンドで(セッションの有効期限やその他の理由で)ログアウトした場合、画面に表示されるJSレイヤーを実装して、ユーザーがすぐに再度ログインしてWebサイトを引き続き使用できるようにしました。

問題は、ユーザーがフォームへの入力中にログアウトした場合、JSレイヤーを使用して再度ログインした後も、既に入力した値を使用して同じフォームを表示しているにもかかわらず、セッションが変更されることです。したがって、フォームのCSRFトークンは無効です。

現在のセッションと特定のフォームに基づいて新しいCSRFトークンを生成し、AJAXで取得して、フォームに置き換える方法はありますか?または多分これに他の解決策がありますか?

CSRF保護を無効にしたくありません。

4

4 に答える 4

34

デフォルトのCSRFプロバイダーを使用していると仮定すると、AJAXコントローラーでCSRFプロバイダーサービスを取得し、トークンの再生成を「要求」できます。

Symfony 2.3(およびそれ以前)

/** @var \Symfony\Component\Form\Extension\Csrf\CsrfProvider\SessionCsrfProvider $csrf */
$csrf = $this->get('form.csrf_provider');
$token = $csrf->generateCsrfToken($intention); 

return new Response($token);

Symfony 2.4

/** @var \Symfony\Component\Security\Csrf\CsrfTokenManagerInterface $csrf */
$csrf = $this->get('security.csrf.token_manager');
$token = $csrf->refreshToken($intention);

return new Response($token);
于 2012-07-24T14:10:33.933 に答える
10

これを使用してCSRFトークンを再生成します(Symfony2.4以降):

$csrf = $this->get('security.csrf.token_manager'); //Symfony\Component\Security\Csrf\CsrfTokenManagerInterface
$token = $csrf->refreshToken($intention); // Intention is specified in form type

return new Response($token);
于 2014-05-14T15:03:44.447 に答える
4

はい、ボットはcsrfトークンをフェッチしてフォームに何かを投稿できますが、トークンはセッションにバインドされているため、問題ではありません。CSRFトークンは、ボットによるフォームの送信を防ぐことを目的としたものではありません。

于 2014-10-23T19:52:50.797 に答える
1

私にとってより簡単な解決策は、同じフォームでユーザーをリダイレクトし、POSTを介してすでに挿入されたデータを渡すことです。
このようにして、トークンは自動的に再度生成されます。
さらに、データ入力が失われることはありません。

于 2012-07-13T08:36:04.780 に答える