ひょんなことからRailsのアプリを触る機会があり、Railsデフォルトで用意されているCSRF対策について調査しています。
Railsではデフォルトでapplication_controller
内にprotect_from_forgery with: :exception
の記述があります。
これにより、POST、PUTの際にヘルパーが自動的にauthenticity_token
を生成(もしくはヘッダーに付与)し、セッション変数と照らし合わせることによりCSRFの対策をしているようです。
しかしながら、実際の挙動を確認したところ、
一度生成されたauthenticity_token
は使いまわしが可能
という挙動になっていました。
authenticity_token
は通常にサイト内回遊すると、毎回別のトークンが生成されますが、「必ずしもそこで生成されたトークンである必要はない」ということです。(前ページで生成されたトークンも使用可能)
※もちろん別セッションとなった場合の使い回しは不可能
これってCSRF対策として十分なんでしょうか?仮にauthenticity_token
の値を知り得てしまった場合、セッションが消えるまではそのトークンを用いることでリクエスト自体は通ってしまうため、ちょっと微妙なのでは、、、?と思ってます。
この辺りの挙動/あるべき姿に詳しい方からのご教示をお待ちしています。

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。