セッションについて
Cookieと異なる点
- データがサーバ側で管理される。
- ネットワーク上を実データが流れない。
ガベージコレクターの設定(php.ini の設定)
php.ini の session.gc_maxlifetime パラメータを使い設定する。
規定では1440秒(24分)。
ガベージコレクターの実行確率は、session.gc_probability と session.gc_divisor パラメータによって決定する。
規定でこれらの数は1/100なので、ガベージコレクターはセッション開始時に1/100の確率で起動する。
セッション情報の保存先(php.ini の設定)
セッション関数は、規定でセッション情報をファイルとして保存する。
php.ini の session.save_path パラメータはセッションの保存先を指定する。
ここで指定したパスが存在しないとエラーになるので注意。
セッションクッキーについて(php.ini の設定)
session.cookie_lifetime | 有効期限。規定値の0はブラウザを閉じるまでクッキーが有効であることを示す。通常この値は変更しない。 | 0 | 0 |
session.cookie_path | 有効なパス。 | “/” | 適宜 |
session.cookie_domain | 有効なドメイン | “”(現在のドメイン) | “” |
session.cookie_secure | 暗号化通信でのみクッキーを送信するかどうか。 | Off | On(HTTPS環境の場合) |
session.cookie_httponly | HTTPクッキーを有効にするかどうか。 | Off | On |
session.cookie_samesite | クロスサイトリクエストでクッキー送信を制限するかどうか。 | “”(送信) | Lax(制限) またはStrict(厳密な制限) |
セッションIDの受渡にクッキーのみを使うよう設定(php.ini の設定)
php.ini での パラメータ名 | 概要 | 規定値 | 推奨値 |
session.cookie_lifetime | 有効期限。規定値の0はブラウザを閉じるまでクッキーが有効であることを示す。通常この値は変更しない。 | 0 | 0 |
session.cookie_path | 有効なパス。 | “/” | 適宜 |
session.cookie_domain | 有効なドメイン | “”(現在のドメイン) | “” |
session.cookie_secure | 暗号化通信でのみクッキーを送信するかどうか。 | Off | On(HTTPS環境の場合) |
session.cookie_httponly | HTTPクッキーを有効にするかどうか。 | Off | On |
session.cookie_samesite | クロスサイトリクエストでクッキー送信を制限するかどうか。 | “”(送信) | Lax(制限) またはStrict(厳密な制限) |
セッションIDの受渡にクッキーのみを使うよう設定(php.ini の設定)
パラメータ名:session.use_only_cookies
PHPはクッキーを使えないクライアントのために、セッションIDをURL経由で受渡する仕組みがある。
セッションIDが表示されてしまう点でセキュリティ上好ましくないので、規定のOnから変更しない方が良い。
セッションID生成・扱いに関するパラメータ(php.ini の設定)
session.sid_length | セッションIDの長さ。(22~256) | 32 | 48(最低32) |
session.sid_bits_per_character | セッションIDで利用できる文字あたりのビット数。(4~6) | 4 | 6 |
session.use_strict_mode | 未初期化のセッションIDを拒否するかどうか。(サーバ側で生成していないIDが送信された時に受け入れるかどうか) | Off | On |
クッキーからセッションIDを取得できなかった場合、
ページ上の相対パスからセッションIDを取得するかどうか(php.ini の設定)
php.ini での パラメータ名 | 概要 | 規定値 | 推奨値 |
session.sid_length | セッションIDの長さ。(22~256) | 32 | 48(最低32) |
session.sid_bits_per_character | セッションIDで利用できる文字あたりのビット数。(4~6) | 4 | 6 |
session.use_strict_mode | 未初期化のセッションIDを拒否するかどうか。(サーバ側で生成していないIDが送信された時に受け入れるかどうか) | Off | On |
クッキーからセッションIDを取得できなかった時、ページ上の相対パスからセッションIDを取得するかどうか(php.ini の設定)
パラメータ名:session.use_trans_sid
規定はOff。
このパラメータをOnにすると、クッキーからセッションIDを取得できなかった時に、
ページ上の相対パスからセッションIDが埋め込まれる。
セッションIDがURL経由で受渡されることになるので、セキュリティ上好ましくない。
動作確認用コード
概要
下記4点のファイルを適宜配置して、Webブラウザから動作確認をすれば良い。
環境:PHP 8.2.4
SessionTest1.php
<?php
session_start();
?>
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<title>SessionTest1.php</title>
</head>
<body>
<form method="post" action="SessionTest2.php">
<label>英数字を入力して下さい:</label>
<input type="text" name="txtbox">
<input type="submit" value="送信">
</form>
</body>
</html>
SessionTest2.php
<?php
session_start();
$_SESSION['txtbox'] = $_POST['txtbox'];
?>
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<title>SessionTest2.php</title>
</head>
<body>
セッション情報を保存しました。<br>
<br>
<a href="SessionTest3.php">セッション情報を確認する</a>
</body>
</html>
SessionTest3.php
<?php
session_start();
?>
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<title>SessionTest3.php</title>
</head>
<body>
$_SESSION['txtbox']の値は、
<?php
print(($_SESSION['txtbox'] ?? '値がありません') . ' ');
?>
です。<br>
<br>
<a href="SessionTest4.php">セッションを破棄する</a>
</body>
</html>
SessionTest4.php
<?php
// セッション開始。
session_start();
// セッション変数を空にする。
$_SESSION = [];
// セッション用クッキーが存在するなら破棄。
if (isset($_COOKIE[session_name()])) {
$cparam = session_get_cookie_params();
setcookie(session_name(), '', time() - 3600,
$cparam['path'], $cparam['domain'],
$cparam['secure'], $cparam['httponly']);
}
// セッションを破棄。
session_destroy();
?>
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<title>SessionTest4.php</title>
</head>
<body>
セッションを破棄しました。<br>
<br>
<a href="SessionTest3.php">SessionTest3.phpへ移動して確認する</a>
</body>
</html>