topic: session-cookie (session / cookie / login / CSRF) / ch05 — CSRF とトークン / 演習 01

📝 ドリル 01 — CSRF トークンを生成して Session に保存

問題

CSRF 防御の出発点 — ランダムなトークンを生成して $_SESSION['csrf_token'] に保存 する処理を書いてください。

  • random_bytes(32) でランダム 32 バイトを取得
  • bin2hex() で 16 進文字列 (64 文字) に変換
  • $_SESSION['csrf_token'] に保存
  • 保存したトークンの 長さ"length: 64" の形式で 1 行出力する (採点のためにトークン本体ではなく長さを出す)

期待される出力:

length: 64

採点

php scripts/grade.php topics/13-session-cookie/ch05-csrf/drill/01-token-generate/

ヒント

$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
echo "length: " . strlen($_SESSION['csrf_token']) . "\n";
▶ 3v4l で実行

本物の Web で確認したい場合

cd topics/13-session-cookie/ch05-csrf/drill/01-token-generate/
php -S localhost:8000 answer.php

ブラウザのソース表示で hidden input にトークンが入っていることを確認 (本ドリルでは form を出力しないが、本物の Web では <input type="hidden" name="csrf_token" value="..."> を出す)。

テストケース

期待される出力

length: 64

📄 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: random_bytes(32) と bin2hex() で CSRF トークンを生成し $_SESSION['csrf_token'] に保存する
// TODO: "length: 64" の形式で $_SESSION['csrf_token'] の長さを 1 行出力する
✅ 解答例を見る(自分で解いてから)
<?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();

$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
echo "length: " . strlen($_SESSION['csrf_token']) . "\n";