2017-09-20 20 views
1

私はFOSユーザバンドルでSymfony 3.1を使用しています。Symfony 3.1 CSRFトークンがログインフォームに無効です

は私がログインのための「CSRF無効なトークン」のメッセージは、私が第一の要求で、私はトークンを取得することを気づいた(シークレットモードで)私がログイン初めて

を形成し得ます。それから私はページをリフレッシュし、別のページを取得します。それ以来、私は同じトークンを取得します(そして正しく動作します)。例:

1st request: maJl7bBRR0iuOX4A96cOxrsLdklBIxz3mCP7fSMGqQY 
2nd request: q21SVH98tbMLeRIypv2aTn0xBDXJ1khrcL8fIMOU4Y8 
3rd request: q21SVH98tbMLeRIypv2aTn0xBDXJ1khrcL8fIMOU4Y8 
4th request: q21SVH98tbMLeRIypv2aTn0xBDXJ1khrcL8fIMOU4Y8 

私は2回同じテストを行いました。それは最初に失敗した後

<input type="hidden" name="_csrf_token" value="{{ csrf_token('authenticate') }}"> 

:フォームでCSRFの入力は次のように生成され

Cache-Control:no-cache 

:理由ヘッダのブラウザのキャッシュの問題ではないようです

時間は、すべてのものは、私は、検証にので、私は失敗している疑いがあるCSRFトークンの私が初めてログインに失敗していないしたい

(第二CSRFトークンが正常に動作します)OKになりbecau私が上で述べたことのse。 CSRF保護の削除は解決策ではありません。

ありがとうございます!

UPDATE

私は問題ではなく、解決策を見つけました。プロジェクトはMySQLにセッションデータを保存します。初めてアクセスするとデータベースにデータが挿入されるのではなく、2番目に挿入されます。データは、$ _SESSIONに存在しているが、それはMySQLの中で最初に保存されていないとして、CSRFトークンが失われた。(私はこれが、このHow to show the last queries executed on MySQL?にアプリのおかげで作られたクエリをロギングました)。ファイルにセッションを保存する

が正常に動作します。これは解決策ではありません。異なるサーバーに複数のアプリケーションインスタンスが存在するためです。

答えて

0

問題は、ほぼすべてのアプリケーションで使用されるサービスでは、何らかの理由でPDOセッションハンドラが設定されていない原因はどの

$session = new Session(); 

があったということでした。

溶液は、サービス

public function __construct(..., Session $session) 

にセッションを注入しservice.ymlに

- '@session' 
ようにそれを注入することでした
関連する問題