質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.81%

Cookieは暗号化されていれば盗まれてもいいの?

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 6
  • VIEW 11K+

komachi

score 99

Cookieは暗号化されていれば盗まれても良いのでしょうか?
というのも、現在学習中のRuby on Rails4において、参考にしている定番サイト(Rails tutorial)の「第8章ログイン、ログアウト」において、そのような旨の記述があったためです。
http://railstutorial.jp/chapters/log_in_log_out?version=4.2#sec-a_working_log_in_method

問題は、次の一節です。

sessionメソッドで作成した一時cookiesは自動的に暗号化され、リスト8.12のコードは保護されます。そしてここが重要なのですが、攻撃者がたとえこの情報をcookiesから盗み出すことができたとしても、それを使って本物のユーザーとしてログインすることはできないのです。

なぜ、「攻撃者がたとえこの情報をcookiesから盗み出すことができたとしても、それを使って本物のユーザーとしてログインすることはできない」と言えるのかがわかりません。私の認識では、暗号化された一時cookies(user_idが含まれています)をサーバが受取り、それを復号化して認証を行っているのですから、たとえcookieが暗号化されているとしても、それをそっくりそのまま盗んでしまえば、それを使って本物のユーザになりすませてしまうと思うのですが。。。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    退会済みユーザー

    2016/09/27 01:10

    参照している文章に「それに続けて「ただし今述べたことは、sessionメソッドで作成した「一時セッション」にしか該当しません」と書いてあるので、「一時セッション」では、毎回、暗号鍵が変わるようなことをしていませんか?

    キャンセル

  • komachi

    2016/09/27 02:24

    アドバイスありがとうございます。このsessionメソッドはRailsに実装されているものですので、暗号鍵が変わっているかどうかはコードを見ないとわかりません。また、習熟度が低いためコードを見ても判断がつかないかもしれません。

    キャンセル

回答 2

checkベストアンサー

+11

私の認識では、暗号化された一時cookies(user_idが含まれています)をサーバが受取り、それを復号化して認証を行っているのですから、たとえcookieが暗号化されているとしても、それをそっくりそのまま盗んでしまえば、それを使って本物のユーザになりすませてしまうと思うのですが。。。

これは、komachiさんが正しいでしょう。教材の説明が間違っていると思います。cookie が盗まれれば、それが一時Cookie であってもセッションハイジャックは可能です。

おそらく、暗号化されているので、Cookieからは userid さえもわからないということ、 一時 Cookie なら、ブラウザを閉じれば値が破棄されるので、永続 Cookie よりは安全ということが言いたかったのでしょう。

Railsのセッション管理方法についてでは、CookieStore によるセッション管理は「クライアント側にセッション内容を保存するという仕様上、様々な問題を抱えていますので、利用しないほうがいいかと思います。」と書かれており、私もそのとおりだと思います。
他のフレームワークでは、セッション情報を暗号化してCookie に詰めてブラウザに保存したりしません。 Cookieは乱数で発生し、サーバ側のテーブルでセッション情報を対応させるのが普通です(Rails では ActiveRecordSessionStore ならそうなっている)。

この教材の続く章も見ましたいが、はっきり言って、セッション管理については、教材として悪いでしょう。セッションハイジャックについては、IPAの解説がわかりやすいと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/27 22:31

    ご回答ありがとうございます。ご提示いただいたIPAの解説を参考にします。また、railsではActiveRecordSessionStoreの使用を検討します。

    キャンセル

  • 2016/10/05 11:38 編集

    ちょっとよくわからないのですが Cookie がどう生成されていようが(セッションデータではなくセッションキーを保持する形であろうが) Cookie 盗まれたらセッションハイジャックされることに変わりない気がするのですが、そういったことまで防ぐ仕組みが ActiveRecordSessionStore にはあるのでしょうか?

    キャンセル

  • 2016/10/05 11:52

    いえ、 Cookie が盗まれれば、ActiveRecordSessionStoreでもセッションハイジャックされます。すみません、ActiveRecordSessionStore の話は蛇足です。komachi さんもそこは理解していただいていると思います。
    セッションハイジャックされにくくする方法としては、送信元IPをセッションテーブルに保存してチェックするとかがありますが、Cookie が盗まれること自身があってはならないことです。XSS 攻撃を防御したり、 http のアクセスに対して Cookie を漏らしたりしないように注意したりするほうが大事です。

    キャンセル

+1

Railsチュートリアル運営チームの安川です!直後の文で補足されているように、セッションハイジャックの可能性は常に付きまといます ><💦

ただし今述べたことは、sessionメソッドで作成した「一時セッション」にしか該当しません。cookiesメソッドで作成した「永続的セッション」ではそこまで断言はできません。永続的なcookiesには、セッションハイジャックという攻撃を受ける可能性が常につきまといます。ユーザーのブラウザ上に保存される情報については、第9章でもう少し注意深く扱うことにします。
https://railstutorial.jp/chapters/basic_login?version=5.1#code-log_in_function

では sessions のときには暗号化せずに、cookies のときは暗号化しているのか (どっちみちセッションハイジャックされるとダメなら無駄では??) の理由についてですが、こちらはセキュリティの専門家である @ockeghem さんが Quora で回答した次の解説が分かりやすいかなと思います 😉

Q. セッションを暗号化することになんの意味がありますか?暗号化したとしても、その暗号化したものを使ってリクエストしてしまえばサーバー側で復号してくれるので通ってしまうと思います。
https://jp.quora.com/sesshon-wo-angou-ka-suru-kotoni-nan-no-imi-ga-arima-suka-angou-ka-shita-toshite-mo-sono-angou-ka-shita-mono-wo-shi-tte-rikuesuto-shi-te-shima-e-ba-sa-ba-gawa-de-fukugou-shi-te-kureru-node-toori-tte-shimau-to-omoi

なお、上記で回答されている徳丸先生には、Railsチュートリアルを題材にしたセキュリティ入門についても解説していただきました。登壇時の内容およびスライド資料などは下記の記事にまとめています。ご参考になれば幸いです。

🔐 Railsエンジニアのためのウェブセキュリティ入門に参加
https://yasslab.jp/ja/news/secure-programming-with-rails

Tokumaru-san no Slide

技術の変化に伴ってRailsチュートリアル自体も更新を加える必要もあるため、現在はチームでコンテンツの更新に日々励んでいます!他にも何か気になる点がありましたら @RailsTutorialJP までご連絡いただけると嬉しいです (>人< )✨

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.81%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る