セキュアなセッションのベストプラクティス
再生成と各種フラグを使ってセッション固定攻撃とセッションハイジャックを防ぎます
「セキュアなセッションのベストプラクティス」はCoddyKit上の無料PHP Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPHP Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 PHP Academyコースには全4レッスンが含まれています。
セッション固定攻撃
攻撃者が、すでに把握しているセッションIDをユーザーに使わせ、ログイン後にそのセッションを乗っ取る攻撃です。
セッション固定の防止: session_regenerate_id()
ログインやロール変更など、権限が変わるたびに、既存のセッションデータを保持したまま新しいセッションIDを生成してください。
<?php
session_start();
// After successful login:
session_regenerate_id(true); // true = delete old session file
$_SESSION["user_id"] = $userId;セッションハイジャック
攻撃者は、ネットワークスニッフィング、XSS、またはログ漏えいによってセッションIDを盗みます。HTTPS、HttpOnly Cookie、フィンガープリント照合で対策します。
session.cookie_httponly
JavaScriptからセッションCookieを読み取れないようにします。これにより、XSSを利用したセッションの盗難の大半を防げます。
<?php
ini_set("session.cookie_httponly", 1);
session_start();session.cookie_secure
セッションCookieにSecure属性を設定し、HTTPS経由でのみ送信されるようにします。
<?php
ini_set("session.cookie_secure", 1);
session_start();session.cookie_samesite
SameSiteをStrictまたはLaxに設定し、セッションCookieを利用したCSRF攻撃を防ぎます。
<?php
ini_set("session.cookie_samesite", "Strict");
session_start();User-Agentバインディング
ログイン時にUser-Agentをセッションに保存し、ハイジャックを検出するためにすべてのリクエストで検証します。
<?php
if (!isset($_SESSION["ua"])) {
$_SESSION["ua"] = $_SERVER["HTTP_USER_AGENT"];
} elseif ($_SESSION["ua"] !== $_SERVER["HTTP_USER_AGENT"]) {
session_destroy();
die("Session invalid");
}セッションタイムアウト
アクティビティに基づくタイムアウトを実装し、操作していないユーザーを自動的にログアウトさせます。
<?php
$timeout = 1800;
if (isset($_SESSION["last_active"]) &&
time() - $_SESSION["last_active"] > $timeout) {
session_destroy();
header("Location: /login");
exit;
}
$_SESSION["last_active"] = time();session.use_strict_mode
厳格モードを有効にすると、サーバーは認識されていないセッションIDを拒否します。これにより、URLインジェクションによるセッション固定を防げます。
<?php
ini_set("session.use_strict_mode", 1);
session_start();カスタムセッションハンドラー
セッションをRedisまたはデータベースに保存すると、ユーザーのすべてのセッションを一元的に無効化し、アクティブなセッションを監視できます。
定期的な再生成
認証済みのセッションが長時間続く場合でも、トークンが盗まれるリスクを低減するため、15~30分ごとにセッションIDを再生成します。
まとめ
常にHTTPSを使用し、HttpOnly+Secure+SameSiteフラグを設定し、ログイン後にsession_regenerate_id(true)を呼び出し、アイドルタイムアウトを実装して、厳格モードを使用します。
クイックチェック
session_regenerate_id(true)は何を行いますか?
よくある質問
「セキュアなセッションのベストプラクティス」レッスンは無料ですか?
はい。「セキュアなセッションのベストプラクティス」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、PHP Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 PHP Academyコースには全4レッスンが含まれています。
「セキュアなセッションのベストプラクティス」で何を学びますか?
再生成と各種フラグを使ってセッション固定攻撃とセッションハイジャックを防ぎます ブラウザで直接実行するハンズオンコードでPHP Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
PHP Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのPHP Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「セキュアなセッションのベストプラクティス」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このPHP Academyレッスンでコードを書いて実行できますか?
はい。すべてのPHP Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- セッションの開始と利用
- セキュアなセッションのベストプラクティス
- Cookieの設定と読み取り
- Cookieのセキュリティ:HttpOnlyとSecureフラグ