バックグラウンド
私は経験豊富な Web 開発者 (主に Python と CherryPy を使用) で、安全なセッション管理をゼロから実装したことがあり、現在は Rails を学習しています。インスタンスおよびビュー コンテキストsession
で使用可能なオブジェクトによって公開される Rails セッションの動作を調査しています。ActionController
質問/問題
Rails 4 のセッションのデフォルトの実装では、暗号化された改ざん防止 Cookie が使用されていることを読みました。これは、セッションの偽造 (改ざん防止) や ID が何であるか (暗号化されている) を誰かに知られることを心配することなく、ユーザー セッションのユーザー ID を保持するために使用できることを意味すると思います。これをテストして、セッション Cookie が変更された場合にレールがどうなるかを確認したかったのです。
そこで、ブラウザのアドオンを使用してセッション Cookie 属性の内容を変更し、新しい Cookie 値でページをリロードすると、Rails は と の異なる新しい値を喜んで提供してくれsession_id
ます_csrf_token
。
セッション Cookie の整合性に何が起こった!?
Rails は (HMAC 署名を介して) Cookie が変更されたことを検出し、それについて何らかの方法で通知するべきではありませんか?
わいせつなほど明らかな何かが欠けているのではないかと恐れていますが、Webで答えを探すのに苦労しており、ソースコードも簡単にあきらめていません(私はRubyが初めてです)。前もって感謝します。
実験
新しいアプリを作成し、index
アクションを含むコントローラーを生成しました。
$ rails new my_app
$ cd my_app; rails g controller home index
次に、次の 2 行をapp/views/layouts/application.html.erbファイルに追加しました。
<%= session.keys %><br/>
<%= session.values %>
開発サーバーを起動し、ブラウザを「localhost:3000/home/index」に移動しました。予想どおり、ページの下部に次の行があります。
["session_id", "_csrf_token"]
["8c1558cabe6c86cfb37d6191f2e03bf8", "S8i8/++8t6v8W8RMeyvnNu3Pjvj+KkMo2UEcm1oVVZg="]
ページをリロードすると、同じ値が得られますが、アプリは_my_app_session
毎回 Cookie 属性の新しい値を設定します。私には奇妙に思えますが、同じセッション ハッシュ値を取得しているので、クールだと思います。
次に、Chrome の Cookie 編集アドオンを使用して、_my_app_session
Cookie 属性の値を変更しました (属性値の最初の文字を置き換えました)。ページをリロードすると、何も起こらずにまったく異なる値が表示されます。何?