MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
PHPの基礎 - セッションのソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
PHPの基礎 - セッション
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == Webセッションは、Webアプリケーション開発において、重要な概念の1つである。<br> <br> セッションは、ユーザがWebサイトやアプリケーションとの対話中に維持される状態情報を管理する仕組みである。<br> これにより、ユーザがWebページ間を移動する際に、一時的なデータや認証情報を保持することができる。<br> セッションは、ユーザの操作の一貫性を維持するものである。<br> <br> Webセッションの役割として、ユーザがWebサイト上で何か特定の操作を行う間、その操作のコンテキストや状態を保持するのに役立つ。<br> 例えば、ショッピングサイトのカートに商品を追加する場合、セッションはそのカート内の商品リストや数量を保持することができる。<br> <br> このように、セッションは、ユーザエクスペリエンスを向上させるのに役立つ重要なものである。<br> <br><br> == セッションの仕組み == 一般的に、セッションはユーザがWebサイトにアクセスした時に開始される。<br> その後、一定の条件が満たされた時に終了する。<br> <br> セッションの開始時には、ユーザに一意のセッションIDが割り当てられる。<br> このセッションIDは、サーバサイドでセッションデータを識別するために使用される。<br> <br> セッションIDとは、ユーザを一意に識別するためのランダムな文字列または数字の組み合わせである。<br> セッションIDは、クッキー、URLパラメータ、またはヘッダ等の方法でクライアントに送信されて、サーバでセッションデータと関連付けられる。<br> <br> クッキーは、セッション管理のために広く使用されるメカニズムの1つである。<br> WebブラウザはセッションIDをクッキーとして保存して、次回のリクエスト時にサーバに送信することにより、サーバは正確なセッションを特定して、ユーザのセッション情報を維持することができる。<br> <br><br> == セッションとクッキーの違い == セッションは、データの一時的な保存と管理を担当するものである。<br> クッキーは、クライアント側にデータを保存するためのメカニズムである。<br> <br> セッションはクッキーを使用して実現されることが多いが、異なる役割を果たす。<br> <br><br> == セッションの使い方 == ==== セッションの設定 ==== Webアプリケーションでは、セッションを設定して管理する方法が重要である。 一般的に、プログラミング言語やフレームワークに組み込まれたセッション管理機能を使用している。<br> <br> ==== セッションのデータ保存 ==== セッションを活用するには、ユーザの操作に関連するデータをセッションに保存する必要がある。<br> <br> これには、ショッピングカート内の商品、ユーザの個人情報、設定オプション等が含まれている。<br> <br> ==== セッションの有効期限管理 ==== セッションは一時的なものであるため、有効期限を設定することが重要である。<br> <br> セッションが長時間アクティブである場合、セキュリティリスクが高まる可能性があるため、セッションのタイムアウトを設定することが推奨される。<br> <br> ==== セッションのセキュリティ ==== セッションデータのセキュリティは非常に重要である。<br> <br> セッションIDを保護し、不正アクセスから保護するためのセキュリティ対策が必要となる。<br> 例えば、セッションハイジャッキング等の攻撃からの保護策を実装することが不可欠である。<br> <br><br> == セッションの活用方法 == セッションは、Webアプリケーション開発において非常に重要な要素である。<br> 正しく管理することにより、ユーザエクスペリエンスの向上、セキュリティの強化、効果的なデータ収集等が可能となる。<br> <br> ==== ログイン ==== セッションはログインシステムにおいて広く使用されている。<br> <br> 例えば、ユーザがWebサイトにログインする時、セッションに認証情報やユーザコンテキストが保存される。<br> その後、リクエストにおいて、セッションを介してユーザを識別することにより、特定の機能やデータにアクセスできるようになる。<br> <br> セッションを使用することにより、ユーザはログインしたままWebサイト内を移動することができる。<br> <br> ==== ショッピングカート ==== ショッピングサイトでは、セッションがショッピングカートの実装に不可欠である。<br> <br> 例えば、ユーザが商品をカートに追加する時、その情報はセッションに保存される。<br> ユーザがチェックアウトするまで、一貫性のあるショッピング体験を提供することができる。<br> <br> ==== トラッキングと分析 ==== Webサイトのトラフィックを分析する際にもセッション情報は役立つ。<br> <br> 例えば、ユーザのセッションごとに以下のデータを取得して追跡することができる。<br> * 訪問時間 * 閲覧ページ * アクション <br> つまり、ユーザエンゲージメントやコンバージョン率の向上に役立つデータを収集できる。<br> <br><br> == セッションの開始 == セッションとは、クッキーは管理する値をクライアントに保存するのに対して、セッションは管理する値をサーバに保存する。<br> クライアントには、どのセッションを使用しているかを識別するためのセッションIDのみをクライアントに保存する。<br> <br> 一般的に、セッションIDをクッキーの値としてクライアントに保存する。(セッションを使用する場合、クッキーも同時に使用する)<br> また、重要なデータを扱う場合はセッションを使用する。<br> <br> クライアントから初めてアクセスがある場合、<code>session_start</code>関数を使用して、新しいセッションを作成してセッションを開始する必要がある。<br> bool session_start() session_start関数は、セッションを作成する。 もしくは、リクエスト上でGET、POST、クッキーにより渡されたセッションIDに基づき、 現在のセッションを復帰する。 戻り値: 常にTRUEを返す。 <br> セッションが開始されていない状態で<code>session_start</code>関数が呼ばれる場合、新しいセッションを開始してセッションIDを割り当てる。<br> セッションIDは、クライアントにクッキー名<code>PHPSESSID</code>で保存される。<br> (クライアントがクッキーを利用できない場合、次のセクションに記載する)<br> <br> 既にセッションが開始されているクライアント(既にセッションIDがクッキーとして保存されているクライアント)からアクセスがある場合、<br> <code>session_start</code>関数を実行しても新たにセッションを開始せずに、サーバに保存されているセッション変数を利用できるように準備する。<br> <br> 以下の例では、セッションを開始して、クライアントにセッションIDがクッキーとして保存しているか確認している。<br> 初めてアクセスする場合、セッションIDが割り当てられて、クライアントは自動的にクッキーを利用してセッションIDを保存する。<br> 次回以降は、クッキー名PHPSESSIDがクライアントから送信されて、新たにセッションは開始されずに、以前のものを利用する。<br> <br> また、セッションIDにはランダムな値が設定される。<br> <syntaxhighlight lang="php"> <?php session_start(); ?> <?php if(!isset($_COOKIE["PHPSESSID"])) { print('初回の訪問です。セッションを開始します。'); } else { print('セッションは開始しています。<br>'); print('セッションIDは '.$_COOKIE["PHPSESSID"].' です。'); } ?> </syntaxhighlight> <br><br> == セッション変数の書き込みと読み込み == セッションを開始することで、サーバに管理する値(セッション変数と呼ぶ)を複数保存することができる。<br> クライアントごとに様々な値が書き込まれるため、セッションIDを識別子として、クライアントを識別することができる。<br> <br> セッション変数に値を書き込む場合は、定義済みの変数<code>$_SESSION</code>を使用する。<br> $_SESSION[セッション変数名] = 値 <br> 例えば、セッション変数visitedに値を書き込む場合、以下のように記述する。<br> $_SESSION["visited"] = 1; <br> 以下の例では、セッションを開始して、セッション変数visitedに値を保存している。<br> 同一のWebページにアクセスするごとにセッション変数の値を増加させて、前回アクセスした日時も表示している。<br> <syntaxhighlight lang="php"> <?php session_start(); ?> <?php if(!isset($_SESSION["visited"])) { print('初回の訪問です。セッションを開始します。'); $_SESSION["visited"] = 1; $_SESSION["date"] = date('c'); } else { $visited = $_SESSION["visited"]; $visited++; print('訪問回数は'.$visited.'です。<br>'); $_SESSION["visited"] = $visited; if(isset($_SESSION["date"])) { print('前回の訪問日時は'.$_SESSION["date"].'です。<br>'); } $_SESSION["date"] = date('c'); } ?> </syntaxhighlight> <br><br> == セッション変数の削除とセッションIDの削除 == 保存されたセッション変数を削除するには、<code>unset</code>関数を使用する。<br> <br> void unset(mixed var [, mixed var [, mixed ...]]) unset関数は、指定した変数を破棄する。 パラメータ: var 削除したい変数 <br> 以下の例では、セッション変数visitedを削除している。<br> <syntaxhighlight lang="php"> unset($_SESSION("visited")); </syntaxhighlight> <br> また、全てのセッション変数を削除するには、以下のように空の配列を変数<code>$_SESSION</code>に代入する。<br> <syntaxhighlight lang="php"> $_SESSION = array(); </syntaxhighlight> <br> <u>※注意</u><br> <u>変数<code>$_SESSION</code>自体を削除しないこと。</u><br> <br> ログアウト等でセッション自体を破棄する場合、クライアントに保存されているセッションIDを削除した後、セッションを破棄する。<br> まず、クライアントにはクッキーが保存されているため、クッキーを削除する。<br> (クッキーの削除については、[[PHPの基礎 - クッキー#クッキーの削除]]を参照すること)<br> <syntaxhighlight lang="php"> if(isset($_COOKIE["PHPSESSID"])) { setcookie("PHPSESSID", '', time() - 1800, '/'); } </syntaxhighlight> <br> 次に、<code>session_destroy</code>関数を使用して、セッションに登録された値を全て破棄する。<br> bool session_destroy(void) session_destroy関数は、現在のセッションに 関連づけられた全てのデータを破棄する。 この関数は、セッションに関するグローバル変数を破棄しない。 また、セッションクッキーを破棄しない。 戻り値: 成功した場合はtrue、失敗した場合はfalseを返す。 <br> 以下の例では、Sample1.phpのログアウトのリンクを選択して、Sample2.phpでセッションとクッキーを削除している。<br> 次に、Sample3.phpでセッションとクッキーが正常に削除されているかを確認している。<br> <syntaxhighlight lang="php"> // Sample1.php <?php session_start(); ?> <?php if(!isset($_SESSION["visited"])) { print('初回の訪問です。セッションを開始します。'); $_SESSION["visited"] = 1; $_SESSION["date"] = date('c'); } else { $visited = $_SESSION["visited"]; $visited++; print('訪問回数は'.$_SESSION["visited"].'です。<br>'); $_SESSION["visited"] = $visited; if(isset($_SESSION["date"])) { print('前回の訪問日時は'.$_SESSION["date"].'です。<br>'); } $_SESSION["date"] = date('c'); } ?> <p><a href="./Sample2.php">ログアウトする</a></p> </syntaxhighlight> <br> <syntaxhighlight lang="php"> // Sample2.php <?php session_start(); ?> <?php print('セッション変数の一覧を表示します。<br>'); print_r($_SESSION); print('<br>'); print('セッションIDを表示します。<br>'); print($_COOKIE["PHPSESSID"].'<br>'); print('<p>ログアウトします</p>'); $_SESSION = array(); if(isset($_COOKIE["PHPSESSID"])) { setcookie("PHPSESSID", '', time() - 1800, '/'); } session_destroy(); print('<p>ログアウトしました</p>'); ?> <p><a href="./Sample3.php">ログアウトの確認</a></p> </syntaxhighlight> <br> <syntaxhighlight lang="php"> // Sample3.php <?php session_start(); ?> <?php print('セッション変数の確認をします。<br>'); if(!isset($_SESSION["visited"])) { print('セッション変数visitedは登録されていません。<br>'); } else { print($_SESSION["visited"].'<br>'); } print('セッションIDの確認をします。<br>'); if(!isset($_COOKIE["PHPSESSID"])) { print('セッションは登録されていません。<br>'); } else { print($_COOKIE["PHPSESSID"].'<br>'); } ?> </syntaxhighlight> <br><br> == セッション名の取得と変更 == セッションを開始した時、クライアントのクッキー名として使用する変数(セッション名)において、初期値はPHPSESSIDである。<br> この値の初期値は、php.iniファイルで設定されている。<br> <br> この初期値を変更する場合は、php.iniファイルの<code>session.name</code>項目を編集する。<br> <u>セッション名は英数字を組み合わせて指定する必要がある。</u><br> 例. session.name = HOGE <br> セッション名がPHPSESSIDではない可能性があるため、<code>session_name</code>関数を使用してセッション名を取得する。<br> string session_name([string name]) session_name関数は、カレントのセッション名を返す。 nameを指定する場合、カレントのセッション名はその値に変更される。 セッション名は、リクエストが開始された際に セッション名に保存されたsession.nameの値にリセットされる。 したがって、各リクエストごとに(session_start関数またはsession_register関数を呼ぶ前に)、session_name関数を実行する必要がある。 パラメータ: name 新しく設定したいセッション名 戻り値: 現在のセッション名 <br> <code>session_name</code>関数を引数無しで実行することにより、現在のセッション名を取得できる。<br> また、引数に別のセッション名を指定する場合は、セッション名を変更することが可能である。<br> <syntaxhighlight lang="php"> <?php session_name("phpsession"); session_start(); ?> <?php print('現在のセッション名は'.session_name().'です。'); ?> </syntaxhighlight> <br><br> == セッションIDの取得と変更 == セッションIDは自動的にランダムな値が設定されるが、<code>session_id</code>関数を使用して、任意の値に設定することもできる。<br> <br> string session_id([string id]) session_id関数は、カレントのセッションIDを取得・設定するために使用される。 パラメータ: id カレントのセッションIDを置換する。その際、session_start関数の前に呼ぶ必要がある。 セッションハンドラによっては、セッションIDとして使用できる文字に制限がある場合がある。 例えば、ファイルによるセッションハンドラにおいて、セッションIDとして使用できる文字は、a-z、A-Z、0-9に限られる。 戻り値: session_id関数は、カレントのセッションのセッションID・カレントセッションが存在しない(カレントのセッションIDが存在しない)場合、 空文字列""を返す。 <br> <code>session_id</code>関数を引数無しで使うことで現在のセッションIDを取得することができる。<br> また、引数に値を指定する場合は、セッションIDを指定した値に変更できる。<br> <br> ただし、セッションIDは、セッションハイジャック等を防ぐためにも簡単な値を設定してはならない。<br> したがって、任意でセッションIDを指定しない方がよいと考えられる。<br> <syntaxhighlight lang="php"> <?php session_start(); ?> <?php if(!isset($_COOKIE[session_name()])) { print('初回の訪問です。セッションを開始します。'); } else { print('セッションは開始しています。<br>'); print('クッキーは '.$_COOKIE[session_name()].' です。<br>'); print('session_id関数は '.session_id().' です。<br>'); } ?> </syntaxhighlight> <br><br> == セッションIDの自動変更 == セッションIDが漏洩すると、セッションを乗っ取られる可能性がある。<br> そのため、セッションIDを常に変更することにより、セキュリティを向上させることができる。<br> <br> <code>session_regenerate_id</code>関数を使用して、現在のセッションを終了させることなくセッションIDのみを新しい値に変更できる。<br> <br> bool session_regenerate_id ( [bool delete_old_session] ) session_regenerate_id関数は、現在のセッションIDを新しい値に変更する。 その際、現在のセッション情報は維持される。 パラメータ: (PHP 5.1以降) delete_old_session 関連付けられた古いセッションを削除するかを決める。 初期値はfalseである。 古いセッション情報を残すことは資源の無駄かつセキュリティも悪くなるため、trueを指定することを推奨する。 戻り値: 成功した場合はtrue、失敗した場合はfalseを返す。 <br> 以下の例では、Webページを読み込むたびに、セッションIDを変更している。<br> <syntaxhighlight lang="php"> <?php session_start(); $old_id = session_id(); session_regenerate_id(true); $new_id = session_id(); ?> <?php if(!isset($_COOKIE[session_name()])) { print('初回の訪問です。セッションを開始します。'); } else { print('前のセッションIDは '.$old_id.' です。<br>'); print('今のセッションIDは '.$new_id.' です。<br>'); } ?> </syntaxhighlight> <br><br> __FORCETOC__ [[カテゴリ:Web]]
PHPの基礎 - セッション
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse