PHP セッションと PHP Cookie の例

⚡ スマートサマリー

PHPのCookieとセッションはどちらもステートレスなHTTPプロトコル上で状態を保持しますが、データの保存方法は異なります。このチュートリアルでは、Cookieがクライアント側に小さなファイルを保存する仕組み、セッションがサーバー側にデータを保持する仕組み、そしてそれぞれの作成、読み取り、破棄方法を実際のコード例を用いて解説します。

  • 🍪 クッキーとは何か: クッキーとは、サーバーがクライアントに保存し、以降のリクエストごとに返される、最大4KBの小さなファイルです。
  • 🗄️ セッションの内容: セッションは、$_SESSION配列に格納され、セッションクッキーによって参照される一意のIDでサーバー上にデータを保存します。
  • 🆚 主な違い: Cookieはクライアント側に存在し、少量で機密性の低いデータに適しています。セッションはサーバー側に存在し、より大きなデータやプライベートなデータを保持します。
  • 🛠️ クッキーの作成: setcookie() は、HTML 出力の前に、名前、値、およびオプションの有効期限、パス、ドメイン、セキュア、および httponly フラグを設定します。
  • 📝 セッションの作成: session_start() はセッションを開始し、その後は $_SESSION スーパーグローバル配列を介して値を読み書きします。
  • 🗑️ 清掃: 過去の時刻を設定することでクッキーの有効期限を切るか、session_destroy() でセッションを終了するか、unset() で値をクリアします。
  • 🤖 AIアシスト: AIツールは、安全なセッション処理を実装したり、既存のPHPコードにおけるCookieやセッションの脆弱性を検出したりすることができる。

PHPのクッキーとセッション

クッキーとは何ですか?

クッキーとは、ウェブサーバーがクライアントコンピュータに保存する、最大サイズが4KBの小さなファイルです。

Cookie が設定されると、後続のすべてのページ リクエストは Cookie の名前と値を返します。

Cookieは、発行元のドメインからのみ読み取ることができます。たとえば、www.guru99.comドメインを使用して設定されたCookieは、別のドメインからは読み取ることができません。 キャリア.guru99.com.

インターネット上のほとんどの Web サイトには、広告などの他のドメインの要素が表示されます。 これらの要素を提供するドメインは、独自の Cookie を設定することもできます。 これらはサードパーティ Cookie として知られています。

ユーザーが作成した Cookie は、そのユーザーのみに表示されます。 他のユーザーはその値を確認できません。

ほとんどのウェブブラウザには、Cookie、サードパーティCookie、またはその両方を無効にするオプションがあります。

この場合、PHP はクッキー トークンを渡して応答します。 URL.

以下に示す図は、Cookie がどのように機能するかを示しています。

クッキーとは

ここでは、

1) ユーザーがクッキーを保存するページをリクエストする

2) サーバーはユーザーのコンピュータに Cookie を設定します。

3) ユーザーからの他のページ要求は、Cookie の名前と値を返します。

Cookie を使用する理由と使用時期?

  • HTTPはステートレスプロトコルです。クッキーを使用すると、 tracCookieは、ユーザーのコンピューターに保存された小さなファイルを使用してアプリケーションの状態を記録します。Cookieの保存場所はブラウザによって異なります。Internet Explorerでは通常、一時インターネットファイルフォルダに保存されます。
  • ユーザーエクスペリエンスのパーソナライズは、ユーザーが好みの設定を選択できるようにすることで実現されます。その後のページリクエストは、Cookieに設定された好みに基づいてパーソナライズされます。
  • Tracking ユーザーが訪問したページ

Cookieの作成

それでは、クッキーを作成する際に使用する基本的な構文を見ていきましょう。

<?php

setcookie(cookie_name, cookie_value, [expiry_time], [cookie_path], [domain], [secure], [httponly]);

?>

ここに、

  • 「setcookie」は PHP関数 クッキーの作成に使用されます。
  • 「cookie_name」は、サーバーが$_COOKIE配列変数から値を取得する際に使用するクッキーの名前です。必須項目です。
  • 「cookie_value」はクッキーの値であり、必須項目です。
  • 「[expiry_time]」はオプションです。クッキーの有効期限(例:1時間)を設定するために使用できます。有効期限は、PHPのtime()関数に0より大きい秒数を加算または減算して設定します。例えば、1時間の場合はtime() + 3600となります。
  • 「[cookie_path]」はオプションです。 これは、サーバー上の Cookie パスを設定するために使用できます。 スラッシュ「/」は、Cookie がドメイン全体で利用可能になることを意味します。 サブディレクトリは、サブドメインへの Cookie アクセスを制限します。
  • 「[domain]」はオプションです。これは、Cookie アクセス階層を定義するために使用できます。 www.cookiedomain.com ドメイン全体を意味する一方 www.sub.cookiedomain.com Cookie へのアクセスを制限します www.sub.cookiedomain.com およびそのサブドメイン。
  • 「[secure]」はオプションです。デフォルトはfalseです。この設定は、CookieがHTTPS経由で送信されるか(trueの場合)、HTTP経由で送信されるか(falseの場合)を決定するために使用されます。
  • 「[httponly]」はオプションです。true に設定すると、クライアント側のスクリプト言語(例: Javaスクリプト Cookieにアクセスできません。

注意: PHPのsetcookie関数は、HTMLの開始タグの前に実行する必要があります。

それでは、クッキーを使った例を見てみましょう。

ユーザー名を60秒後に有効期限が切れるクッキーに保存できる基本的なプログラムを作成します。

以下のコードは、上記の例「cookies.php」の実装を示しています。

<?php
setcookie("user_name", "Guru99", time()+ 60,'/'); // expires after 60 seconds
echo 'the cookie has been set for 60 seconds';
?>

出力:

the cookie has been set for 60 seconds

Cookie値の取得

次のコードを含む「cookies_read.php」という名前の別のファイルを作成します。

<?php
print_r($_COOKIE); // output the contents of the cookie array variable
?>

出力:

Array ( [PHPSESSID] => h5onbf7pctbr0t68adugdp2611 [user_name] => Guru99 )

注:$_COOKIEはPHPの組み込みスーパーグローバル変数です。設定されているすべてのクッキーの名前と値が含まれています。

Cookieの数とサイズはブラウザによって制限されており、通常はドメインあたり約50個、Cookie1個あたり約4KBです。

アプリケーションのテストを行います。PHPファイルをphptutsフォルダに保存済みであると仮定します。

  • ステップ 1 – ウェブ ブラウザを開き、 URL http://localhost/phptuts/cookies_read.php

Cookie値の取得

注: 空の配列のみが表示されています

  • ステップ2 – 閲覧先 URL http://localhost/phptuts/cookies.php

Cookie値の取得

  • ステップ3 – 最初のタブに戻り、更新ボタンをクリックします。

Cookie値の取得

1分ほど待ってから、もう一度更新ボタンをクリックしてください。どのような結果が出ましたか?

Cookieの削除

  • 有効期限が切れる前に Cookie を破棄したい場合は、有効期限をすでに経過した時刻に設定します。
  • cookie_destroy.php という名前の新しいファイルを作成し、以下のコードを記述してください。
<?php

setcookie("user_name", "Guru99", time() - 360,'/');

?>
  • 上記セクションのクッキー値の取得手順1~3を繰り返してください。
  • Video Cloud Studioで URL http://localhost/phptuts/cookie_destroy.php
  • に切り替える URL http://localhost/phptuts/cookies_read.phpどのような結果が表示されますか?

セッションとは?

  • セッションはサーバーに保存されるグローバル変数です。
  • 各セッションには、保存された値を取得するために使用される一意の ID が割り当てられます。
  • セッションが作成されるたびに、一意のセッション ID を含む Cookie がユーザーのコンピュータに保存され、サーバーへのリクエストごとに返されます。クライアント ブラウザが Cookie をサポートしていない場合、一意の PHP セッション ID は、 URL.
  • セッションには、Cookie に比べて比較的大きなデータを保存できる容量があります。
  • セッション値は、ブラウザを閉じると自動的に削除されます。 値を永続的に保存したい場合は、データベースに保存する必要があります。
  • $_COOKIE 配列変数と同様に、セッション変数は $_SESSION 配列変数に格納されます。 Cookie と同様に、セッションは HTML タグより前に開始する必要があります。

セッションを使用する理由と使用時期

  • ユーザーIDなどの重要な情報を、悪意のあるユーザーが改ざんできないように、サーバー上に安全に保管したいと考えているのですね。
  • あるページから別のページに値を渡したいとします。
  • Cookieをサポートしていないブラウザで、Cookieの代替手段が必要な場合。
  • グローバル変数を、より効率的かつ安全な方法で保存したい場合、 URL.
  • あなたは開発中ですping ショップなどのアプリケーションping 4KBを超える容量の情報を一時的に保存する必要のあるカート。

セッションの作成

セッションを作成するには、まずPHPのsession_start関数を呼び出し、次に値を$_SESSION配列変数に格納する必要があります。

ページが読み込まれた回数を知りたいとしましょう。そのためにはセッションを利用できます。

以下のコードは、セッションから値を作成および取得する方法を示しています。

<?php

session_start(); // start the session

if(isset($_SESSION['page_count']))
{
$_SESSION['page_count'] += 1;
}
else
{
$_SESSION['page_count'] = 1;
}
echo 'You are visitor number ' . $_SESSION['page_count'];

?>

出力:

You are visitor number 1

セッション変数の破棄

session_destroy() 関数は、PHP セッション全体を破棄するために使用されます。

セッション項目を1つだけ削除したい場合は、unset() 関数を使用します。

以下のコードは、両方のメソッドの使用方法を示しています。

<?php

session_destroy(); // destroy entire session

?>
<?php

unset($_SESSION['product']); // destroy product session item

?>

session_destroyは、セッションに関連付けられたCookieを含む、すべてのセッションデータを削除します。

unsetコマンドは個々のセッション変数のみを解放します。その他のデータはそのまま保持されます。

よくあるご質問

Cookieはユーザーのブラウザ上の小さなファイルにデータを保存し、リクエストごとに送信されます。セッションはサーバー上にデータを保存し、セッションID Cookieのみを送信します。セッションは機密データや大容量データの取り扱いに適しています。

PHPはデフォルトでは、セッションデータをphp.iniのsession.save_pathで指定されたパス(多くの場合、システムの一時ディレクトリ)にファイルとして保存します。トラフィック量の多いサイトでは、これをデータベース、Redis、またはMemcachedハンドラに変更することがよくあります。

HttpOnlyフラグを設定して Javaスクリプトはクッキーを読み取ることができません。セキュアフラグが設定されているため、HTTPS経由でのみ送信されます。また、SameSite属性が設定されているため、サイト間送信が制限されます。セッションの場合は、ログイン後にIDを再生成してください。

はい。AIは、セッションIDを再生成し、セキュアなCookieフラグを設定し、サーバー側に最小限のデータを保存し、タイムアウトを適用するログインフローを生成できます。 Rev出力結果をセキュリティ要件と照らし合わせて確認してください。

はい。AIは、HttpOnlyフラグやSecureフラグの欠落、セッション固定のリスク、Cookieへの機密データの保存、ログイン後のID再生成の欠如などをスキャンし、修正されたコードを提案できます。