セッションIDについて

セッションIDの取得には、session_id関数を使用します。引数なしで使用すると現在設定されているセッションIDが取得できます。

session_id();

セッションIDが分かれば他人のログイン状態を乗っ取ることができます。セッションハイジャック対策として、session_regenerate_id関数でセッションIDの再生成ができます。

session_regenerate_id(true);

お問い合わせフォームの入力画面(index.php)でセッションIDを表示します。session_regenerate_id関数を使用しているため、ページにアクセスする度に新しいセッションIDが表示されますが、セッション変数の値は変わりません。つまり、セッション状態が維持されます。

//index.php
<?php
//セッションを開始
session_start();
//セッションIDを更新して変更(セッションハイジャック対策)
session_regenerate_id(true);
//初回以外ですでにセッション変数に値が代入されていれば、その値を。そうでなければNULLで初期化
$username = isset($_SESSION['username']) ? $_SESSION['username'] : NULL;
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<body>
<p>お問い合わせフォーム:入力</p>
<form method="post" action="confirm.php">
<p>お名前:<input type="text" name="username" size="15" value="<?php echo $username; ?>"></p>
<input type="submit" value="確認画面へ">
</form>
<p>セッションID:<?php echo session_id(); ?></p>
</body>
</html>

確認画面(confirm.php)でもセッションIDを表示しますが、ここではセッションIDを再生成していないため入力画面と同一のセッションIDが表示されます。

//confirm.php
<?php
//セッションを開始
session_start();
//POSTされたデータをセッション変数に保存
$_SESSION['username'] = $_POST['username'];
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<body>
<p>お問い合わせフォーム:確認</p>
<p>お名前:<?php echo $_POST['username']; ?></p>
<p><a href="complete.php">送信</a></p>
<p><a href="index.php">入力画面へ戻る</a></p>
<p>セッションID:<?php echo session_id(); ?></p>
</body>
</html>

完了画面(complete.php)でセッションを破棄します。まず$_SESSIONに空の配列を代入し、全てのセッション変数を消去します。次にsession_destroy関数でセッションを破棄します。

session_destroy();

これでセッションIDの表示が消え、入力画面に戻っても入力された値は表示されません。

<?php
//セッションを開始
session_start();
//空の配列を代入し、すべてのセッション変数を消去
$_SESSION = array();
//セッションを破棄
session_destroy();
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<body>
<p>お問い合わせフォーム:完了</p>
<p><a href="index.php">入力画面へ戻る</a></p>
<p>セッションID:<?php echo session_id(); ?></p>
</body>
</html>
タイトルとURLをコピーしました