topic: session-cookie (session / cookie / login / CSRF) / ch04 — ログイン状態を `$_SESSION` で保つ / 演習 02

📝 ドリル 02 — ログイン → ログアウト → 状態確認

問題

$_SESSION を使って「ログイン → ログアウト → マイページ再表示」を 1 スクリプトで擬似化してください。

  • 標準入力 1 行目をログインフォームの送信 (name=太郎) と見なす
  • 「ログイン処理」として $_SESSION['user'] に名前を格納
  • 「ログアウト処理」として $_SESSION = [] + session_destroy() を実行
  • ログアウト後にもう一度 session_start() を呼び、isset($_SESSION['user']) の判定結果に応じて "ログアウト済" を出力する

このドリルの入力例 (tests/input.txt):

name=太郎

期待される出力:

ログイン: 太郎
ログアウト済

採点

php scripts/grade.php topics/13-session-cookie/ch04-login-flow/drill/02-logout/

ヒント

// リクエスト 1: ログイン
parse_str(trim(fgets(STDIN) ?: ''), $_POST);
$_SESSION['user'] = ['name' => $_POST['name']];
echo "ログイン: {$_SESSION['user']['name']}\n";

// リクエスト 2: ログアウト
$_SESSION = [];
@session_destroy();

// リクエスト 3: 再アクセス
@session_start();
if (isset($_SESSION['user'])) {
    echo "ようこそ、{$_SESSION['user']['name']}さん\n";
} else {
    echo "ログアウト済\n";
}
▶ 3v4l で実行

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

cd topics/13-session-cookie/ch04-login-flow/drill/02-logout/
php -S localhost:8000 answer.php

テストケース

標準入力

name=太郎

期待される出力

ログイン: 太郎
ログアウト済

📄 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();

// 採点用: stdin の 1 行目をフォーム送信として $_POST に展開
parse_str(trim(fgets(STDIN) ?: ''), $_POST);

// TODO: ログイン処理として $_SESSION['user'] に ['name' => $_POST['name']] を入れ、
//       "ログイン: {name}" を 1 行出力する
// TODO: ログアウト処理として $_SESSION = []; @session_destroy(); を実行する
// TODO: もう一度 @session_start() を呼び、isset($_SESSION['user']) で判定する
//       未ログインなら "ログアウト済" を 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();

// 採点用: stdin の 1 行目をフォーム送信として $_POST に展開
parse_str(trim(fgets(STDIN) ?: ''), $_POST);

// リクエスト 1: ログイン
$_SESSION['user'] = ['name' => $_POST['name']];
echo "ログイン: {$_SESSION['user']['name']}\n";

// リクエスト 2: ログアウト
$_SESSION = [];
@session_destroy();

// リクエスト 3: 再アクセス
@session_start();
if (isset($_SESSION['user'])) {
    echo "ようこそ、{$_SESSION['user']['name']}さん\n";
} else {
    echo "ログアウト済\n";
}