クッキーとセッション管理

ご注意

このページでは,もし可能ならクッキーを使います。セッションクッキー(ブラウザを終了させれば消えるクッキー)です。

あなたは今回このページに 始めてですね(あるいはクッキーが保存されていませんね)。

再読み込みするか,別のページに行ってからもう一度このページを見てください。

<?php
  session_set_cookie_params(0, '/~okumura/');
  session_start();
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>私のホームページ</title>
<link rel="stylesheet" href="style.css">
</head>
<body>

<p>あなたは今回このページに
<?php
  if (isset($_SESSION['cnt'])) {
    echo $_SESSION['cnt'], " 回目ですね。";
  } else {
    $_SESSION['cnt'] = 1;
    echo "始めてですね(あるいはクッキーが保存されていませんね)。";
  }
  $_SESSION['cnt']++;
?>
</p>

</body>
</html>

クッキーとは

クッキーとは,サーバがブラウザに発行するものです。

このPHPファイルや,このページからリンクされたPHPファイルの先頭には,次のように書いてあります。

<?php
  session_set_cookie_params(0, '/~okumura/');
  session_start();
?>

これは,同じドメイン(ここでは http://oku.edu.mie-u.ac.jp/)の /~okumura/ 以下で使うクッキーを設定するという意味です。もし同じドメインの全領域で使うクッキーを設定するなら,この部分は省略して,単に次の1行を書くだけでかまいません。

<?php session_start(); ?>

このことによって,次の情報を含むクッキーがブラウザに送られます。

セッション名は共通ですが,セッションIDは毎回異なるものが発行されます。実際にブラウザがこのクッキーを食べる(保存する)か捨てるかは自由です。

上の2行は,PHP のソースでは

<ul>
  <li>セッション名: <code><?php echo htmlspecialchars(session_name()); ?></code></li>
  <li>セッションID: <code><?php echo htmlspecialchars(session_id()); ?></code></li>
</ul>

と書いてあります。

セッション名は,無指定では PHPSESSID という文字列になります。

セッションIDはランダムな文字列です。

クッキーは通常はクッキーを発行したサイトのどのページからも読めます。 複数のユーザがサイトを作っている共用サーバでは,これでは他のユーザにセッションを盗まれてしまうので,

  session_set_cookie_params(0, '/~okumura/');

のようにして,/~okumura/ 以下だけで読み出せるようにしておきます(ただしフレームを使えばこの制限をかいくぐることができますので絶対に安全というわけではありません)。

この場合,クッキーはブラウザを終了するまで有効ですが,session_set_cookie_params 関数の第1引数(0 となっているところ)を例えば1000にしておけば,1000秒間有効になります。

<?php
  session_set_cookie_params(1000, '/~okumura/');
  session_start();
?>

次のようにすれば,クッキーがJavaScriptで取得できないようになり,XSS脆弱性が起こりにくくなります(古いブラウザではうまくいきません):

<?php
  session_set_cookie_params(1000, '/~okumura/', $httponly=true);
  session_start();
?>

次のようにすれば,安全な(SSLなどの)接続でしかクッキーを送信しないようになります:

<?php
  session_set_cookie_params(1000, '/~okumura/', $secure=true, $httponly=true);
  session_start();
?>

セッション管理

セッション中では,$_SESSION['foo'] などといった変数がページを超えて使えます。

セキュリティに関すること

暗号化していないhttp通信では,当然ですがクッキーを盗聴できます。クッキーに「secure属性」を付けておけばhttpsだけで送信されます。secure属性の付いていないクッキーは,たとえサイトがhttpsを使っていても,巧妙な方法で盗める可能性があります。PHPの設定ファイル php.inisession.cookie_secure = 1 と書いておけば,このページの方法で発行したクッキーにsecure属性が付きます(他の方法で発行したクッキーに付くわけではありません)。