topic: session-cookie (session / cookie / login / CSRF) / ch06 — Session セキュリティ (regenerate_id / 固定化) / 演習 01

📝 ドリル 01 — `session_regenerate_id(true)` で ID を作り直す

問題

ログイン時の Session ID 再生成を再現してください。

  • session_start() 直後の Session ID (採点用スタブで TESTSESSIONID) を変数に保存
  • session_regenerate_id(true) を呼ぶ
  • 再取得した Session ID と比較し、異なれば "changed: yes"、同じなら "changed: no" を 1 行出力

期待される出力:

changed: yes

採点

php scripts/grade.php topics/13-session-cookie/ch06-session-security/drill/01-regenerate-id/

ヒント

$oldId = session_id();
@session_regenerate_id(true);
$newId = session_id();

echo ($oldId !== $newId ? "changed: yes" : "changed: no") . "\n";
▶ 3v4l で実行

本物のセッション動作で確認したい場合

cd topics/13-session-cookie/ch06-session-security/drill/01-regenerate-id/
php -S localhost:8000 answer.php

ブラウザの開発者ツールで PHPSESSID を見ながらリロード、再生成のタイミングで Cookie 値が変わることを確認。

テストケース

期待される出力

changed: yes

📄 starter.php(雛形)

このコードから書き始めてください。

<?php

// 採点用スタブ: CLI で session_start() を安定動作させるための前処理
error_reporting(E_ERROR);
ini_set('session.use_cookies', '0');
ini_set('session.use_only_cookies', '0');
$tmpDir = sys_get_temp_dir() . '/dojo_l13_' . getmypid();
@mkdir($tmpDir, 0700, true);
session_save_path($tmpDir);
session_id('TESTSESSIONID');
@session_start();

// TODO: 現在の session_id() を $oldId に保存する
// TODO: @session_regenerate_id(true) を呼ぶ
// TODO: 新しい session_id() を $newId に保存する
// TODO: $oldId と $newId が違えば "changed: yes"、同じなら "changed: no" を出力
✅ 解答例を見る(自分で解いてから)
<?php

// 採点用スタブ: CLI で session_start() を安定動作させるための前処理
error_reporting(E_ERROR);
ini_set('session.use_cookies', '0');
ini_set('session.use_only_cookies', '0');
$tmpDir = sys_get_temp_dir() . '/dojo_l13_' . getmypid();
@mkdir($tmpDir, 0700, true);
session_save_path($tmpDir);
session_id('TESTSESSIONID');
@session_start();

$oldId = session_id();
@session_regenerate_id(true);
$newId = session_id();

echo ($oldId !== $newId ? "changed: yes" : "changed: no") . "\n";