PHPでセッションを扱う

セッションについて

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 の設定)

php.ini での パラメータ名
概要
規定値
推奨値
session.cookie_lifetime有効期限。規定値の0はブラウザを閉じるまでクッキーが有効であることを示す。通常この値は変更しない。00
session.cookie_path有効なパス。“/”適宜
session.cookie_domain有効なドメイン“”(現在のドメイン)“”
session.cookie_secure暗号化通信でのみクッキーを送信するかどうか。OffOn(HTTPS環境の場合)
session.cookie_httponlyHTTPクッキーを有効にするかどうか。OffOn
session.cookie_samesiteクロスサイトリクエストでクッキー送信を制限するかどうか。“”(送信)Lax(制限) またはStrict(厳密な制限)

セッションIDの受渡にクッキーのみを使うよう設定(php.ini の設定)

php.ini での パラメータ名概要規定値推奨値
session.cookie_lifetime有効期限。規定値の0はブラウザを閉じるまでクッキーが有効であることを示す。通常この値は変更しない。00
session.cookie_path有効なパス。“/”適宜
session.cookie_domain有効なドメイン“”(現在のドメイン)“”
session.cookie_secure暗号化通信でのみクッキーを送信するかどうか。OffOn(HTTPS環境の場合)
session.cookie_httponlyHTTPクッキーを有効にするかどうか。OffOn
session.cookie_samesiteクロスサイトリクエストでクッキー送信を制限するかどうか。“”(送信)Lax(制限) またはStrict(厳密な制限)

セッションIDの受渡にクッキーのみを使うよう設定(php.ini の設定)

パラメータ名:session.use_only_cookies
PHPはクッキーを使えないクライアントのために、セッションIDをURL経由で受渡する仕組みがある。
セッションIDが表示されてしまう点でセキュリティ上好ましくないので、規定のOnから変更しない方が良い。

セッションID生成・扱いに関するパラメータ(php.ini の設定)

php.ini での パラメータ名
概要
規定値
推奨値
session.sid_lengthセッションIDの長さ。(22~256)3248(最低32)
session.sid_bits_per_characterセッションIDで利用できる文字あたりのビット数。(4~6)46
session.use_strict_mode未初期化のセッションIDを拒否するかどうか。(サーバ側で生成していないIDが送信された時に受け入れるかどうか)OffOn

クッキーからセッションIDを取得できなかった場合、ページ上の相対パスからセッションIDを取得するかどうか(php.ini の設定)

php.ini での パラメータ名概要規定値推奨値
session.sid_lengthセッションIDの長さ。(22~256)3248(最低32)
session.sid_bits_per_characterセッションIDで利用できる文字あたりのビット数。(4~6)46
session.use_strict_mode未初期化のセッションIDを拒否するかどうか。(サーバ側で生成していないIDが送信された時に受け入れるかどうか)OffOn

クッキーからセッション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']の値は、&nbsp;
        <?php
            print(($_SESSION['txtbox'] ?? '値がありません') . '&nbsp;');
        ?>
        です。<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>

コメント

タイトルとURLをコピーしました