3

2.2.1 にアップグレードしたばかりで、CSRF 処理で何が起こっているのか少し混乱しています。デフォルトの構成では、セッション データに明らかに csrfToken があるにもかかわらず、常に「Missing CSRF token」エラーが発生します。

もう少し突っ込んcsrf.sign.tokensで、設定でfalseに設定することでこれを防ぐことができることがわかりました(デフォルトはtrueです)。何らかの理由で次の行:

token.flatMap(Crypto.extractSignedToken)
    .map(token => Token(Crypto.signToken(token)))

inCSRF.getTokenは私に None トークンを与えています。トークン署名が有効になっている場合にのみCSRF が失敗する原因を知っている人はいますか? 私は (故意に) CSRF 関連の設定のデフォルトを変更していません。どういうわけか、トークンの形式が間違っていてCrypto.extractSignedToken失敗しているのではないかと思いますが、なぜそうなるのかわかりません。

アプリケーションの CSRF 保護は、グローバルWithFilters(CSRFFilter())メソッドを使用して行われます。

4

1 に答える 1

1

これは、Play 2.1.x の CSRF トークンが 2.2 または 2.3 の CSRF トークンと互換性がないためと思われます。2.1.x アプリケーションの Cookie を持っていて、アプリケーションを 2.2 にアップグレードした場合、クライアントが古い Cookie 値でリクエストを行うと、この問題が発生する可能性があります。私が見つけた最も簡単な解決策は、次のように application.conf でトークンの名前を変更することでした。

csrf.token.name=csrfToken1

ちょっと厄介なハックですが、うまくいきます。トークンを独自の Cookie に移動することを考えました (csrf.cookie.nameプロパティを使用しましたが、それでも「Missing CSRF Token」エラーが発生しました)

于 2014-09-18T19:35:45.233 に答える