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";本物のセッション動作で確認したい場合
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";