【PHP8.x】session_set_cookie_params関数の使い方

作成日: 更新日:

session_set_cookie_params関数は、PHPのセッションIDを保存するクッキーに関する様々な設定をカスタマイズするために使用される関数です。この関数は、ウェブアプリケーションにおいて、ユーザーのセッション情報を保持するためのクッキーの挙動を詳細に制御します。

具体的には、セッションクッキーの有効期限(lifetime)、クッキーが有効となるパス(path)、ドメイン(domain)、セキュアなHTTPS接続でのみクッキーを送信するかどうか(secure)、JavaScriptからのアクセスを禁止するかどうか(httponly)、そしてクロスサイトリクエストフォージェリ(CSRF)攻撃を防ぐためのSameSite属性などを設定できます。

lifetimeに0を設定すると、ブラウザを閉じたときにセッションクッキーが削除されます。pathに'/'を設定すると、サイト全体でクッキーが有効になります。securetrueにすることで、HTTPS接続以外ではクッキーが送信されなくなり、情報漏洩のリスクを低減します。また、httponlytrueにすると、JavaScriptによるクッキーへのアクセスが制限され、クロスサイトスクリプティング(XSS)攻撃に対する防御策となります。SameSite属性は、クッキーがクロスサイトのリクエストとともに送信される条件を制御し、セキュリティをさらに強化します。

これらの設定は、session_start()関数が呼び出されるよりも前に実行される必要があります。一度設定すると、その後のセッション管理に適用されます。ウェブアプリケーションのセキュリティとユーザー体験に直接影響するため、これらのパラメータを適切に設定することが重要です。

基本的な使い方

構文(syntax)

<?php
session_set_cookie_params([
    'lifetime' => 3600,
    'path' => '/',
    'domain' => '.yourdomain.com',
    'secure' => true,
    'httponly' => true,
    'samesite' => 'Lax'
]);
?>

引数(parameters)

int $lifetime, ?string $path = null, ?string $domain = null, bool $secure = false, bool $httponly = false

  • int $lifetime: クッキーの有効期限を秒単位で指定します。0を指定すると、ブラウザが閉じられるとクッキーは無効になります。
  • ?string $path: クッキーが有効なサーバー上のパスを指定します。デフォルトはルートディレクトリです。
  • ?string $domain: クッキーが有効なドメインを指定します。デフォルトは現在のホストです。
  • bool $secure: trueに設定すると、クッキーはHTTPS接続でのみ送信されます。
  • bool $httponly: trueに設定すると、クッキーはHTTPプロトコル経由でのみアクセス可能になり、JavaScriptからのアクセスはブロックされます。

戻り値(return)

bool

セッションクッキーのパラメータ設定が成功したか失敗したかを真偽値(true または false)で返します。

サンプルコード

PHPセッションクッキー設定とサンプル

<?php

/**
 * session_set_cookie_params() の使用例です。
 *
 * この関数は、セッションを開始する session_start() の前に呼び出す必要があります。
 * セッションIDを保存するクッキーのパラメータ(有効期間、パス、ドメイン、セキュリティ属性)を
 * カスタマイズするために使用します。
 */

// セッションクッキーのパラメータを設定します。
// PHP 7.3以降では、引数を連想配列で渡す形式が推奨されています。
session_set_cookie_params([
    // lifetime: クッキーの有効期間を秒単位で指定します。0の場合はブラウザを閉じるまで。
    'lifetime' => 3600, // 1時間

    // path: クッキーが有効なサイト上のパス。'/' はドメイン全体で有効を意味します。
    'path' => '/',

    // domain: クッキーが有効なドメイン。nullの場合、現在のホスト名が自動的に使われます。
    'domain' => null,

    // secure: trueの場合、クッキーはセキュアな HTTPS 接続の場合にのみ送信されます。
    'secure' => true,

    // httponly: trueの場合、クッキーはHTTPプロトコル経由でのみアクセス可能になります。
    // JavaScriptからのアクセスを防ぎ、セキュリティを向上させます。
    'httponly' => true,
]);

// 上記の設定を適用してセッションを開始します。
session_start();

// 動作確認のため、ページをリロードするたびにカウントアップするセッション変数を準備します。
$count = $_SESSION['view_count'] ?? 0;
$_SESSION['view_count'] = ++$count;

// 現在適用されているセッションクッキーのパラメータを取得します。
$current_cookie_params = session_get_cookie_params();

?>
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>session_set_cookie_params のサンプルコード</title>
    <style>
        body { font-family: sans-serif; line-height: 1.6; padding: 20px; }
        pre { background-color: #f4f4f4; padding: 1em; border-radius: 5px; }
        code { background-color: #eee; padding: 2px 4px; border-radius: 3px; }
    </style>
</head>
<body>
    <h1>session_set_cookie_params() の実行結果</h1>
    <p>
        このページでは、セッションクッキーのパラメータをカスタマイズしています。<br>
        ブラウザの開発者ツール(F12キーなど)で、このサイトのクッキー(名前は通常 <code>PHPSESSID</code>)を確認すると、以下の設定が反映されていることがわかります。
    </p>

    <h2>現在適用されているクッキーのパラメータ</h2>
    <pre><?php print_r($current_cookie_params); ?></pre>

    <h2>セッションデータの確認</h2>
    <p>このページをリロードすると、下のカウントが増加し、セッションが維持されていることが確認できます。</p>
    <pre>ページ表示回数: <?php echo htmlspecialchars((string)$_SESSION['view_count'], ENT_QUOTES, 'UTF-8'); ?></pre>
</body>
</html>

PHPのsession_set_cookie_params関数は、ウェブサイトの訪問者を識別するための「セッションID」を保存するクッキーの振る舞いを細かく設定するために使用されます。この関数は、セッションを開始するsession_start()関数よりも前に、必ず呼び出す必要があります。

引数としては、クッキーの有効期間(lifetime)、クッキーが有効なウェブサイトのパス(path)、ドメイン(domain)、HTTPS接続時のみクッキーを送信するかどうか(secure)、JavaScriptからのクッキーアクセスを禁止するかどうか(httponly)などを指定できます。PHP 7.3以降では、これらの引数を連想配列としてまとめて渡す方法が推奨されており、コードの可読性が向上します。

例えば、lifetime3600と設定するとクッキーは1時間で失効します。securetrueにすると、通信が暗号化されたHTTPSの場合にのみクッキーが送信され、セキュリティが向上します。httponlytrueに設定すると、JavaScriptからのクッキー読み取りを防ぎ、クロスサイトスクリプティング(XSS)攻撃に対する耐性を高めることができます。

この関数は、設定が成功すればtrue、失敗すればfalseを返します。適切に設定することで、セッションのセキュリティと管理の柔軟性を高めることが可能です。

session_set_cookie_params関数は、必ずsession_start()関数を呼び出す前に設定してください。PHP 7.3以降では、引数を連想配列で渡す形式が推奨されており、これにより各パラメータの意味がより明確になります。lifetimeはセッションクッキーの有効期間を秒単位で指定し、0の場合はブラウザを閉じるまで有効です。セキュリティ向上のため、securetrueに設定するとHTTPS接続時のみクッキーが送信され、httponlytrueに設定するとJavaScriptからのクッキーアクセスを防ぐことができます。本番環境では両方をtrueに設定することを強く推奨いたします。pathdomainは、クッキーが有効になるサイトのパスとドメインを設定し、セッションの適用範囲を制御します。

PHPセッションクッキーのSameSite設定

<?php

/**
 * セッションクッキーのパラメータを設定し、セッションを開始します。
 * SameSite属性を「Lax」に設定する例を含みます。
 *
 * システムエンジニアを目指す初心者向けに、セッションとクッキーの基本的なセキュリティ設定を
 * 理解しやすくするために作成されました。
 *
 * @return void
 */
function initializeSessionWithSecureCookieParams(): void
{
    // session_start() を呼び出す前に session_set_cookie_params() を呼び出す必要があります。
    // PHP 8.0以降では、配列形式でクッキーパラメータを設定することが推奨されます。
    // この形式を使用すると、SameSite属性など、より詳細な設定が可能です。
    session_set_cookie_params([
        'lifetime' => 86400, // クッキーの有効期間を1日 (24時間 * 60分 * 60秒) に設定します。
                             // 0を設定するとブラウザを閉じると削除されます。
        'path' => '/',       // クッキーがWebサイト全体で有効になるようにパスを設定します。
        'domain' => '',      // ドメインを空にすると、現在のホスト名に自動的に設定されます。
                             // 特定のドメイン ('example.com') に設定することも可能です。
        'secure' => true,    // HTTPS接続でのみクッキーを送信するように設定します。
                             // 本番環境ではセキュリティのため強く推奨されます。
        'httponly' => true,  // JavaScriptからのクッキーへのアクセスを禁止します。
                             // クロスサイトスクリプティング (XSS) 攻撃の軽減に役立ちます。
        'samesite' => 'Lax'  // クロスサイトリクエストフォージェリ (CSRF) 対策としてSameSite属性を設定します。
                             // 'Lax': 安全性が高く、ほとんどのユースケースで機能するバランスの取れた設定です。
                             //        異なるサイトからのリンクによるGETリクエストではクッキーが送信されますが、
                             //        POSTリクエストでは送信されません。
                             // 'Strict': さらに厳格で、トップレベルのナビゲーション以外ではクッキーを送信しません。
                             // 'None': クロスサイトリクエストでもクッキーを送信しますが、`secure`属性が必須になります。
    ]);

    // 上記の設定を適用した後でセッションを開始します。
    session_start();

    // セッション変数が設定されていない場合、初期値を設定します。
    if (!isset($_SESSION['visits'])) {
        $_SESSION['visits'] = 0;
    }
    // 訪問回数をインクリメントします。
    $_SESSION['visits']++;

    echo "セッションが開始され、クッキーパラメータが設定されました。<br>";
    echo "このページへの訪問回数 (セッション内): " . $_SESSION['visits'] . "<br>";
    echo "現在のセッションID: " . session_id() . "<br>";
    echo "SameSite属性は 'Lax' に設定されています。<br>";
}

// 関数を呼び出してセッション処理を実行します。
initializeSessionWithSecureCookieParams();

?>

session_set_cookie_params関数は、Webサイトのセッション管理において、セッションクッキーがどのように動作するかを細かく設定するために使用されます。この関数は、セッションを開始するsession_start()関数を呼び出す前に設定する必要があり、セッションクッキーのセキュリティを向上させる上で非常に重要です。

PHP 8.0以降では、セッションクッキーの有効期間やパス、ドメイン、HTTPS接続時のみ送信されるsecure属性、JavaScriptからのクッキーアクセスを防ぐhttponly属性など、多様なパラメータを配列形式で一括して設定することが推奨されています。特に、クロスサイトリクエストフォージェリ(CSRF)攻撃から保護するためのsamesite属性は重要で、サンプルでは「Lax」に設定しています。「Lax」は異なるサイトからのリンクによるGETリクエストではクッキーを送信しますが、POSTリクエストでは送信しないため、安全性と利便性のバランスが取れています。

引数には、これらの設定パラメータをキーと値のペアで指定した配列を渡します。関数は、設定が成功した場合はtrueを、失敗した場合はfalseを真偽値として返します。この設定により、セッションクッキーがより安全に扱われ、Webアプリケーション全体のセキュリティ強化に繋がります。

セッションクッキーのパラメータは、session_start()関数を呼び出す前に設定する必要があります。PHP 8.0以降では配列形式が推奨されており、SameSite属性などより詳細なセキュリティ設定が可能です。特に、本番環境ではsecuretrueに設定しHTTPS経由のみでクッキーを送信すること、およびhttponlytrueにしてJavaScriptからのクッキーアクセスを禁止することが必須です。これは、セッションハイジャックやXSS攻撃の対策として非常に重要です。samesite属性はCSRF対策に有効で、Laxは多くのケースでバランスの取れた設定ですが、Noneを選択する場合は必ずsecuretrueにしてください。lifetimeはクッキーの有効期間を秒数で指定します。

【PHP8.x】session_set_cookie_params関数の使い方 | いっしー@Webエンジニア