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

ご注意

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

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

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

<?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'] などといった変数がページを超えて使えます。

細かな点

クッキーとしてブラウザに送られるものはセッション名・セッションIDだけです。情報の実体は,サーバ側(おそらくデフォルトでは /tmp ディレクトリの中だが通常はもっと目立たない場所に変更されている)にファイルとして入ります。セッションの数だけファイルができます。

他の人がログインできるサーバで /tmp のようなところにファイルを置いておくのは危険かもしれません。 中身は見えなくても,セッションIDがファイル名からばれてしまいます。 置き場所を変えるには,PHPの設定ファイル php.ini

session.save_path = "/var/hoge/sessions"

のように目立たない場所に設定するか,あるいはPHPファイル中の session_start(); の前に

session_save_path("/var/hoge/sessions");

のように指定します。このディレクトリは管理人と apache(Webサーバのプロセス)にしか読み書きできないようにします。

セッション管理がうまくいかない場合は,php.ini

output_buffering = Off

となっていたら右辺を 4096 とかにしてみてください。


Last modified: