ログインしても「鍵」はそのまま?セッション固定とCSRFから学ぶ、Webの防犯術
こんにちは!セキュリティの世界へようこそ。
日々コードを書いていると、「動けばいいや」という気持ちになりがちですが、ふとした油断が大きな事故に繋がるのがWeb開発の怖いところです。
今日は、多くの新人が最初につまずく「セッション固定攻撃」と、それと密接に関わる「CSRF(クロスサイト・リクエスト・フォージェリ)」について、家を守る防犯の仕組みになぞらえて解説します。
—
1. 「セッション固定攻撃」ってなに?:玄関の鍵をコピーされる話
まず「セッション」とは、Webサイトが「あなたは誰か」を覚えておくための「一時的な通行証(セッションID)」のことです。
セッション固定攻撃は、こんな状況を想像してください。
1. 泥棒が、誰もいない家の玄関に「合鍵」をこっそり置いておきます。
2. あなたがその家(サイト)を訪れ、泥棒が置いたその合鍵を拾って家に入ります。
3. あなたがログインすると、その合鍵は「ログイン済み」という権利を持つようになります。
4. 泥棒は、あなたが拾ったのと同じ合鍵を持っていて、あなたになりすまして堂々と家に入り込みます。
問題の根本は「ログイン前後で鍵(ID)を変えていないこと」です。
どう対策するの?
対策はとてもシンプルです。「ログインが成功した瞬間に、古い鍵を捨てて、新しい鍵を発行する」こと。これだけで、泥棒が置いていた鍵は無効になります。
実装例(PHPの場合):
// ログイン成功時に必ず実行する
session_start();
// 古いセッションを破棄して、新しいIDを発行する
session_regenerate_id(true);
// これで、ログイン前の怪しいIDは完全に無効化されます!
$_SESSION[‘user_id’] = $user_id;
—
2. 「CSRF」ってなに?:勝手に注文書を送りつけられる話
次にCSRFです。これは「攻撃者があなたのブラウザを操り、意図しない操作をさせる」攻撃です。
例えば、あなたが銀行のサイトにログインしている最中に、攻撃者の用意した悪意あるページをうっかり開いてしまったとします。そのページには隠しボタンがあり、クリックした瞬間に「あなたの口座から犯人の口座へ送金する」という命令が、あなたのブラウザから銀行へ送られてしまいます。
銀行側は「あ、ログイン中の本人からの指示だな」と判断して送金を実行してしまいます。これがCSRFです。
—
3. この2つが合わさると「最強の泥棒」になる
「セッション固定」と「CSRF」を組み合わせると、被害は甚大です。
攻撃者は、あなたがログインしている状態を悪用し、さらにセッションを固定して継続的に被害者をコントロールしようとします。
ここで重要になるのが「CSRFトークン」という仕組みです。
対策:CSRFトークンという「独自の照合スタンプ」
銀行の例で言えば、送金のたびに「今回だけ有効な使い捨てのスタンプ」を要求するようなものです。
- サーバー側:画面を表示するたびに、予測不可能な「秘密のスタンプ(トークン)」を発行し、フォームに隠し項目として埋め込みます。
- ブラウザ側:送信ボタンを押すと、そのスタンプも一緒に送ります。
- サーバー側:送られてきたスタンプが、自分が発行したものと一致するか確認します。
攻撃者はこの「スタンプ」を予測できないため、偽の操作をしてもサーバーに拒否されます。
実装例(HTMLフォーム):
—
4. 今日からできる!防犯のためのチェックリスト
最後に、現場で必ず守ってほしい「防犯の基本」をまとめました。
1. セッション再生成を忘れない:ログイン処理の最後には必ず session_regenerate_id() を。
2. CSRF対策は全フォームに:データの変更(書き込み・削除・送金など)を伴うすべての処理で、CSRFトークンの検証を強制してください。
3. SameSite属性を設定する:クッキーに SameSite=Lax または Strict を設定しましょう。これにより、別のサイトからの不審なアクセス時にクッキーが送られなくなります。
設定例(PHPのセッション設定):
session_set_cookie_params([
‘lifetime’ => 0,
‘path’ => ‘/’,
‘secure’ => true, // HTTPS通信のみ許可
‘httponly’ => true, // JavaScriptからのアクセスを禁止(XSS対策)
‘samesite’ => ‘Lax’ // CSRFへの強力なガード
]);
—
セキュリティは、一度設定して終わりではありません。泥棒も常に新しい手口を考えています。
でも、まずは「鍵を変える」「スタンプで確認する」という基本的な防犯から始めれば、あなたの書くコードはグッと強固になります。
一歩ずつ、着実に。一緒に安心できるWebを作っていきましょう!
コメント