2017-05-09 11 views
0

ユーザーは、メッセージを作成して、事前に決められた英数字コードを使用して広告媒体を介してメッセージを共有できるSaaSプラットフォームを構築しました。CSRF - 正常にセッションを正常に終了しない

私たちのフォームはすべて、CSRFトークンを使用していますが、私は問題に気づきました。ユーザーがメッセージを編集しているときに休憩して編集やヒットを保存し直すと、「CSRF不一致」という警告メッセージが表示されます。これは、有効なトークンを再生成するためにページをリフレッシュし、変更を失わなければならないため、重大な問題です。

初期のCSRFトークンは、filenameやphp_uname()などの静的なパラメータに基づいて生成されますが、session_id()でも生成されています。したがって、session_idが変更されると、新しいCSRFトークンが生成され、明らかに古いトークンと一致しないため、警告メッセージが表示されます。

ユーザー認証が必要なフォームでCSRF保護を無効にするのは簡単ですが、ユーザーログインなどの認証を必要としないフォームがいくつかあります。ユーザーのログインに「CSRFの不一致」を示すのは大したことではありませんが、それが何を意味するのか分からないユーザーにはうんざりしていて、「この問題を解決」してサイトを離れることになります。

だから私は、無防備な警告メッセージを生成せずに、フォーム保護の外観を維持するための代替ソリューションを探しています。

代わりにCSRFオフに基づいてSESSION_IDを生成する2つの潜在的なソリューション...

1)は、それはいくつかのクッキーの値をオフに基づいて生成し、これは優雅なクロスセッション処理が可能になります。

2)CSRFをまとめて削除します。代わりに、すべてのフォーム投稿のREFERERを検証し、親ドメインと一致する場合は続行します。これにより、他のサイトが私たちのフォームに投稿されないようにします(CSRFの主な目的)。実際にこのソリューションをajaxリクエストに使用しています。

私はオプション#2に傾いていますが、考慮すべき他の優雅なソリューションがあるかどうかを確認したいと考えました。

+0

REFERERは使用しないでください。スプーフィングするのは簡単ではなく、信頼できません。 –

+0

@AlexHowansky:良い点が記載されています。 –

答えて

0

私はオプション#1(Cookieソリューション)に行き、永続的なログインクッキーのようにCSRFシードを扱いました。現在のセッションでシードが利用できない場合は、Cookieが存在する場合はそれをチェックし、現在のセッションに値を設定します。うまく動作していると思われ、古いセッションを超越しています。

関連する問題