玄関の鍵を渡す「ふり」をする泥棒?セッション固定攻撃の正体
こんにちは。セキュリティの世界に足を踏み入れた皆さん、ようこそ。今日は、Webアプリ開発の現場で「絶対に忘れてはいけない」基本中の基本、セッション固定攻撃(Session Fixation)についてお話しします。
「認証してるんだから大丈夫でしょ?」と思っているあなた。実は、そこが一番の盲点なんです。まずは、泥棒の手口から紐解いていきましょう。
1. セッション固定攻撃って何?家の鍵で例えると…
Webサイトにログインするとき、サーバーはあなたに「入館証(セッションID)」を発行します。この入館証があるおかげで、サイトを移動するたびに「私、さっきログインした誰々です」と証明しなくて済むわけです。
さて、もし泥棒が、「まだ誰も使っていない、真っさらな入館証」をあなたに拾わせたらどうなるでしょうか?
1. 罠を仕掛ける: 攻撃者は、あらかじめ自分のブラウザでそのサイトにアクセスし、サーバーから「入館証A」を受け取ります。
2. ターゲットを誘う: 「このリンクからログインして!」と、その「入館証A」を埋め込んだURLをあなたに送りつけます。
3. あなたがログイン: あなたがそのURLをクリックしてログインすると、サーバーは「お、さっき入館証Aを持っていた人だね。じゃあ、その入館証Aを『ログイン済み』として有効化してあげよう」と処理します。
4. 乗っ取り完了: サーバー側では「入館証A=あなた」と紐付いていますが、攻撃者も同じ「入館証A」を持っています。結果、攻撃者はあなたのログイン権限をそのまま使えてしまうのです。
これが、家の鍵を渡すふりをして、実は合鍵を作らせていたような「セッション固定攻撃」のメカニズムです。
—
2. どうすれば防げるの?「ログインの瞬間に鍵を変える」
この攻撃を防ぐための特効薬は非常にシンプルです。「認証が成功した瞬間に、古い入館証を捨てて、新しい入館証を発行する」こと。これを「セッションIDの再生成」と呼びます。
ログインする前の「怪しい入館証」を捨ててしまえば、攻撃者がいくら罠を仕掛けていても、それは無効な鍵になってしまうわけですね。
3. 実践!コードで見るセッション再生成
現代の主要なフレームワークには、これを自動、あるいは簡単な記述で行う機能が備わっています。今回は、多くの現場で使われるPHPを例に見てみましょう。
コードのポイント:
- `session_regenerate_id(true);` の `true` という引数が肝です。これを指定することで、古いセッションファイル(データ)をサーバー上から確実に削除してくれます。これを忘れると、対策が中途半端になってしまうので注意してくださいね。
—
4. セキュリティを高めるための「守りの壁」
セッションIDを再生成する以外にも、Webサイトを泥棒から守るための「防犯設定」があります。これらは、Webサーバー(ApacheやNginx)の設定ファイルや、PHPの設定(php.ini)で行います。
- HttpOnly属性: JavaScriptからセッションIDを盗めないようにします。
- Secure属性: 暗号化された通信(HTTPS)でしかIDを送信しないようにします。
- SameSite属性: 外部サイトからの悪意あるリクエストを遮断します。
php.ini での推奨設定例:
; セッションIDをJavaScriptから読み取れないようにする
session.cookie_httponly = 1
; HTTPS通信時のみクッキーを送信する
session.cookie_secure = 1
; クロスサイトリクエストを抑制する
session.cookie_samesite = “Lax”
—
最後に:セキュリティは「疑う」ことから始まる
「フレームワークがやってくれるから大丈夫」という考え方は、時として一番の脆弱性になります。ログイン処理を書くとき、ふと立ち止まってこう自分に問いかけてみてください。
「今、この瞬間に鍵を取り替えたかな?」
この小さな問いかけが、あなたの手掛けるアプリケーションを、強固な要塞へと変えていきます。最初は難しく感じるかもしれませんが、一つひとつ学んでいけば必ず身につきます。一緒に、安全なインターネットの未来を作っていきましょう!

コメント