2

私はフォームを持っています。そのフォーム内の Select-Element を変更すると、同じ URL に対して Ajax-Call を実行します。これにより、基本的に、いくつかのフィールドが追加された、またはいくつかのフィールドが削除された (異なるカテゴリ、異なるフィールドなど) 新しいフォームが読み込まれます。

これで、トークンは 1 つの要求に対して存続するため、要求から取得したフォームには明らかに同じ Csrf-Token が含まれます。つまり、この種のアクションを行うたびに新しいトークンを生成する必要がありますが、これを行う方法がまったくわかりません。

私の仮定は、私は次のようなことをしなければならないということです

if ($request->isXmlHttpRequest()) {
    $form->get('csrf')    ->regenerateCsrfToken()
}

しかし、明らかにその機能は存在しませんが、それらの行に似たものでなければなりません。どんな入力でも大歓迎です

4

2 に答える 2

4

これを試しましたか:

if ($request->isXmlHttpRequest()) {
    $form->get('csrf')->getCsrfValidator()->getHash(true);
}

getHash(true)はハッシュを再生成し、変更されたハッシュをジェネレーターに保存するため、後で要素から取得するときにフォームが新しい値を取得します。

于 2013-08-16T11:46:42.223 に答える
1

@MichaelGoodenの答えは絶対に正しいです。それが問題に対する一般的なアプローチです。ただし、私が行ったことには、内部に別のエラーがあり、他のユーザーにも関連している可能性があります。私のselect.onChange()方法は次のとおりです。

  • フォームデータを保存
  • 新しいフォームを取得 (GET /item/add/categoryId)
  • 同一のフォーム フィールドに再入力する

これを行うと、誤ってCSRFトークンも保存され、保存されたトークンが新しいトークンとして再入力されました。明らかにそれはうまくいきませんでした。したがって、私のform.rePopulate(data)機能では、CSRF要素を単に除外しました。それだけで、すべてが魅力のように機能します。

于 2013-08-16T11:52:20.733 に答える