ホームページ  >  記事  >  バックエンド開発  >  PHP で SESSION を維持する方法とそれによって生じる考え_PHP チュートリアル

PHP で SESSION を維持する方法とそれによって生じる考え_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-15 13:26:27836ブラウズ

セッションとは何ですか?

WIKIの説明によると、SESSIONとは2つの通信機器間に存在する対話型の情報であり、ある時刻に確立され、一定期間後に消滅するそうです。一般的なセッションには、TCP セッション、WEB セッション (HTTP セッション)、ログイン セッションなどが含まれます。 OSI モデルにおけるセッション実装のさまざまな場所に応じて、セッションは主にいくつかのタイプに分けられます。1 つは、WEB セッション (HTTP セッション) と Telnet リモート ログイン セッションを含むアプリケーション層セッションです。セッション層実装には、セッション開始プロトコルが含まれます。 (SIP) ) およびトランスポート層で実装されるインターネット電話通話は TCP SESSION です。

この記事では主に WEB SESSION について説明します。大きく分けて、クライアント側 SESSION とサーバー側 SESSION の 2 種類があります。Java Beans によって提供される最も一般的なものは後者です。

セッションって何をするの?

コンピュータ分野、特にネットワークにおいては、SESSIONが特に広く使われており、対話(Dialogue)、セッションなどとも呼ばれ、一般に2つの通信機器間で保存される状態を指すこともあります。ユーザー間およびコンピュータ間 (ログイン SESSION)。

ステートレス通信とは異なり、SESSIONは通常、通信状態を保存するために使用されるため、通信を行う2者のうち少なくとも一方がSESSIONの履歴を保存する必要があります。

SESSION(WEB SESSION)はどのように実施されるのですか?

ブラウザとサーバー間でHTTP通信が行われると、通常、ステータスを識別するためにHTTP Cookieが含まれ、通常、ユーザーのいくつかの検証情報とレベルが記録されます。

いくつかのプログラミング言語で最も一般的に使用される Http セッション トークンは、JSESSIONID (JSP)、PHPSESSID (PHP)、ASPSESSIONID (ASP) です。この識別子は通常、ハッシュ関数によって生成され、ユーザーの ID を一意に表すことができます。サーバーとクライアントが通信するとき、通信は GET または POST パラメータとしてクライアントに保存されます。

SESSION を実装するには通常、サーバー側 SESSION とクライアント側 SESSION の 2 つの方法があります。どちらの方法にも独自の長所と短所があります。

サーバー側の SESSION は実装が簡単で比較的効率的ですが、負荷分散や高可用性の要件が発生した場合の処理​​がより困難になります。また、内生システムにストレージ デバイスがない場合にも使用できません。負荷分散は、ファイル システムを共有するか、顧客に 1 つのサーバーのみに強制的にログインさせることで実現できますが、これでは効率が低下します。ストレージのないデバイスの場合、サーバー側の SESSION 実装は RAM を使用して解決することもできます (参考資料 6 を参照)。この方法は、クライアント接続が制限されているシステム (ルーティングまたはアクセス ポイント デバイスなど) に効果的です。

クライアント側の SESSION を使用すると、負荷分散アルゴリズムの回避など、サーバー側の SESSION のいくつかの問題を解決できますが、それ自体がいくつかの問題を引き起こすこともあります。クライアント SESSION は、Cookie と暗号化テクノロジーを使用して、異なるリクエスト間の状態を保存します。各動的ページが終了すると、現在のセッションがカウントされ、クライアントに送り返されます。リクエストが成功するたびに、Cookie がサーバーに送信され、サーバーがユーザーの ID を「記憶」できるようになります。クライアント SESSION の最も重要な問題はセキュリティです。Cookie がハイジャックまたは改ざんされると、ユーザーの情報のセキュリティが失われます。

PHPでSESSIONを設定するにはどうすればよいですか?

PHP 開発環境をセットアップした後、phpinfo() を通じて以下を含む SESSION 関連部分を表示できます:

SESSION モジュール、PHP V5.2.9 バージョンでは、合計 25 個の変数があります。そのうちのいくつかは、通常、以下で使用されます:

Session.cookie_lifetime ストレージの cookie の名前を設定 sessionid

session.name session、デフォルトは phpsessid です

SaVE_HANDLER Se SSION のストレージメソッド、デフォルトはファイル

session .save_pathデフォルトでは、Fedora

session.gc_probability

session.gc_divisor

session.gc_maxlifetime の下の /var/lib/php/session に保存されます。 これら 3 つのオプションは、GC メカニズムの確率を処理するために使用されます

session.cache_limiter (nocache、private、 private_no_expire,public)

session.cache_expire これら 2 つのオプションは、SESSION ページをキャッシュするために使用されます

まず最初の質問について考えてみましょう。SESSION の有効期限はどのくらいかかりますか? PHP プログラムで SESSION を使用する場合は、まず session_start() を参照する必要があります。この関数が実行されると、SESSION ファイルが SESSION の格納ディレクトリに生成されます (ファイル ハンドラーが使用されている場合)。同時に参照すると、サーバーはハッシュされた SESSION 名を保存する PHPSESSID という名前の Cookie を参照します。

SESSION の有効期限は、ガベージ コレクション メカニズム (ガベージ コレクション) に依存します。SESSION が作成されると、クライアント スクリプトが SESSION 内の変数にアクセスするたびに、SESSION ファイルのアクセス時間が変化します。更新します。各訪問は、クライアントに保存されている SESSIONID に基づいて、サーバーに保存されている一意の SESSION を要求します。クライアントの Cookie の有効期限が切れると、サーバー上の SESSION ファイルはまだアクセスされていませんが、どの SESSION にアクセスするかを知ることはできません。有効期限が切れると、サーバー リソースが無駄に消費されます。

同時に、ユーザーのセッションをすぐに期限切れにしたい場合は、Cookie を設定することでこれを実現できます。 SESSION リサイクルは、ページがアクセスされるたびに実行されます。リサイクルの確率は session.gc_probability、session_gc_divisor で指定され、デフォルトは ±1/100 です。 1 に設定すると、SESSION がその有効期間を超えてアクセスされるたびに、SESSION がリサイクルされます。

2 つの要件: 1. PHP で SESSION が期限切れにならないようにするか、SESSION の有効期限を延長します。 2. SESSION をすぐに期限切れにします。

1. PHP では、特に内部アプリケーション システムや大規模なフォームがある場合、SESSION が期限切れにならないようにし、SESSION の有効期限を延長することが非常に必要です。上司がフォームに記入するときのことを考えてください。ちょうど昼食の時間でした。彼は昼食から戻ってくるまでフォームを保管し、残りの内容を記入します。送信後に表示されるのは、通常、ログイン インターフェイスです。ユーザーエクスペリエンスを向上させたい場合は、上司のフォームが問題を引き起こすのを防ぐことが重要です。SESSION のライフサイクルを延長する必要があります。

PHP で SESSION の期限切れを防ぎ、SESSION の有効期限を延長するには、session.gc_maxlifetime を設定することで実現できますが、まず、gc がリサイクルを実行する前にクライアントの Cookie が期限切れにならないようにする必要があります。 gc_maxlifetime を長く設定すると、セッションの有効期間を延長できますが、すべてのリクエストが長期間保持されるわけではないアプリケーションの場合、これは明らかにサーバー構成にとって最良の選択ではありません。

SESSIONのリサイクルメカニズムは、SESSIONファイルの最終アクセス時刻に基づいて判断され、maxlifetimeを超えた場合、リサイクル確率に従ってリサイクルされることがわかっています。したがって、SESSION に定期的にアクセスするだけで済みます。これは、ページを更新することで実現できます。これには解決策があります。

JS を介して定期的にページにアクセスします。

Iframe を使用してページを定期的に更新します。

ページに他の要素が埋め込まれないように、プログラムを直接使用してリクエストを送信します。 SESSION の有効期限が切れないようにするため、ページ (大きなフォーム ページなど) で SESSION を長期間維持するだけで済みます。

<ol class="dp-c">
<li class="alt"><span><span><script type=</SPAN><SPAN class=string><FONT color=#0000ff>"text/javascript"</FONT></SPAN><SPAN>>  </span></span></li>
<li>
<span>        </span><span class="keyword"><strong><font color="#006699">function</font></strong></span><span> keepMeAlive(imgName){  </span>
</li>
<li class="alt"><span>            myImg = document.getElementById(imgName);  </span></li>
<li>
<span>            </span><span class="keyword"><strong><font color="#006699">if</font></strong></span><span>(myImg) myImg.src = myImg.src.replace(/?.*$/, </span><span class="string"><font color="#0000ff">'?'</font></span><span> + Math.random());  </span>
</li>
<li class="alt"><span>        }  </span></li>
<li><span> </span></li>
<li class="alt">
<span>        window.setInterval(</span><span class="string"><font color="#0000ff">"keepMeAlive('phpImg');"</font></span><span>, 4000);  </span>
</li>
<li><span>    </script>  </span></li>
<li class="alt"><span>    <img id=</SPAN><SPAN class=string><FONT color=#0000ff>"phpImg"</FONT></SPAN><SPAN> src=</SPAN><SPAN class=string><FONT color=#0000ff>"http://www.phpplot.com/phpplot/session/sess_refresh.php?"</FONT></SPAN><SPAN> width=</SPAN><SPAN class=string><FONT color=#0000ff>"1"</FONT></SPAN><SPAN> height=</SPAN><SPAN class=string><FONT color=#0000ff>"1"</FONT></SPAN><SPAN> /> </span></li>
</ol>
このリンクのリクエストがブラウザによってキャッシュされないように、URL の後に乱数が追加されます。

2. SESSION をすぐに期限切れにする方法はたくさんあります。session_destroy() を使用することも、上記のアイデアを使用して session_destroy ページをリクエストすることもできます。

セッションは安全ですか?

PHP マニュアルには明確に記載されています: SESSION は、SESSION に保存された情報が作成者のみに表示されることを保証しません。

一部のリモート操作を安全に処理したい場合は、HTTPS が唯一の選択肢です。最も基本的なことは、SESSION にユーザーの情報が存在するからといって、そのユーザーは本人である必要があると考えないことです。ただし、SESSION 内の情報によりユーザー名とパスワードによって認証されているかのように錯覚します。したがって、パスワードなどを変更する必要がある場合は、ユーザーにパスワードの再入力を求めることをお勧めします。

初期の Apache バージョンでは、PHPSESSID の保存に COOKIE を使用していませんでしたが、URL の書き換えを使用していました。つまり、アクティブ化された Apache の新しいバージョンの SESSION に属していることを示すために、各 URL の後に PHPSESSID= が追加されます。デフォルトではオフに設定されています。

session.use_trans_id = 0;

したがって、この意味で、SESSION を長時間延長したり、SESSION をオンラインに維持したりすることは、セキュリティにとって常に良いことではありません。究極の解決策は、ユーザーがログイン後に送信してログイン ウィンドウにジャンプし、すべてのデータが残っている状態で入力ページに戻ることです。これの実装は、Ajax を使用して解決するのは難しくありません。現在のユーザー データは、XML であっても JSON であっても、一定の間隔で保存場所に POST されます。

PHP で SESSION を維持する:

クライアントが JavaScript をサポートしていない場合に採用できるメソッド:

1. フローティング レイヤーを作成し、それを最上位に表示します。ユーザーが JS を無効にしない場合は、フローティングレイヤーが消えます;

2. すべての INPUT を無効に設定し、JS を使用して有効に設定します。

上記の方法はどちらも JS が無効になっている場合に使用され、すべての機能が利用できなくなります。JS が無効になっている場合でもアプリケーションを正常に動作させる方法はさらに難しいようです。これを達成するのにかかる時間と得られる結果を比較検討する必要があります。


www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/446605.html技術記事セッションとは何ですか? WIKIの説明によると、SESSIONとは、2台の通信機器間に存在する対話型の情報であり、ある時刻に確立され、一定期間が経過すると消滅するそうです。一般的な SESSION には次のものが含まれます: T...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。