コンピューター ウィンドウズ インターネット

セッション。 操作の詳細な説明とメカニズムの説明。 PHP組織でのセッションIDの保護inurlguestbook php phpsessid

PHPでのセッション、またはサイトにアクセスしたユーザーや顧客に関するデータが、サイトのページ間を簡単に移動するときにどのように保存されるか。 レッスンはとても重要です。 サイトの95%の作成に関連します。

PHPのセッションとは

セッションは、同じサイトのページ間を移動するときに、一時データに関する情報(たとえば、ユーザーがサイトに入ったという情報)を格納するために使用されます。 セッションを使用する場合、データはサーバー上の一時ファイルに保存されます。
ほとんどの場合、セッション(およびCookieも)は、オンラインストア、フォーラム、メッセージボード、 ソーシャルネットワーク、ブログ、その他のリソース。 セッションシステムの便利さは、ログインしたユーザー/顧客の一時的な情報を保存することにあり、そのデータは一定時間すばやくアクセスできます。 セッションには、ブラウザが閉じられるまで、自然な有効期限があります。 ページのみを閉じた場合、サイトを開いたときに、ユーザー/購入者に関するデータは引き続き利用できます。

セッションロジック

セッション(またはセッション)は、一種の一時的なデータストレージです。 少量のデータを保存する価値があることをすぐに警告します。 たとえば、ログインしているユーザーのログインとパスワード、またはデータベース内の彼のシリアル番号。

仕事の例
1. ユーザーがユーザー名とパスワードを入力してサイトに入る
2. ログインとパスワードを含むデータは、サイトのいずれかのページのセッションに保存されます。

ファイル index.php

Session_start(); //セッションデータを使用する各ファイルには、コードの先頭に「セッションの開始」コマンドが含まれている必要があります

$ login = "admin";
$ password = "pass";
$ _SESSION ["login"] = $ login; //ログインを含む変数を保存します
$ _SESSION ["password"] = $ password; //パスワードを含む変数を保存します

3. サイトの別のページに移動すると、このデータも利用できるようになります。

ファイル example.php(または他のページ)

「あなたのログイン」をエコーし​​ます。$ _ SESSION ["login"]; //このページにはデータを記録していませんが、「ログインは管理者です」と表示されます。
ほら、簡単です!

4. セッションデータをクリアしたい場合は、それで十分です。

ファイル example.php

Session_start(); //「セッションを再開」

未設定($ _ SESSION ["login"]); //これは、変数が登録解除または「破棄」された方法です
echo "あなたのログイン"。$ _ SESSION ["login"]; //「あなたのログイン」を表示します。 最後の行で破壊したので、データもありません。

Session_destroy(); //セッションを破棄します。 $ _SESSION ["password"]を含むすべてのデータが失われました。 要求されると、エラーが表示されます
一般的に、そのような転送はに似ています POSTメソッド、ただし、不要なコードを大量に記述する必要がなくなり、ページ間で転送されるすべてのデータがサーバー上の一時ファイルに保存されます。 繰り返しになりますが、セッションには少量のデータが含まれている必要があるため、ユーザー名/パスワード、ショッピングカート、その他の少量を保存するのに適しています。

PHPセッションを使用して値または配列を渡す

セッションでは、文字列だけでなく、データの配列も書き込むことができます。 アレイのサイズでやりすぎないでください。これはすべて、サーバーのパフォーマンスと占有スペースに影響します。

再び特定のものを使用します スタートページ index.php

Session_start();

$ r = array( "one"、 "two"、 "three");

$ _SESSION ["arr"] = $ r;

すべてが表示されているページへ
セッションでデータを保存し、別のページへのリンクをたどると、すべてのデータが表示されます。

ファイル受信者、ページ test.php配列を開く場所

Session_start();
print_r($ _ SESSION ["arr"]);
//出力します
/*
配列
=> 1つ
=> 2つ
=> 3つ
*/
?>
のチュートリアルをブラッシュアップすることをお勧めします。 一般的に、すべてが明確でなければなりません。

セッションを操作するための他の関数

session_unregister(文字列)-セッションは指定されたグローバル変数の値を忘れます。
session_destroy()-セッションが破棄されます(たとえば、ユーザーがログアウトボタンを押してシステムを離れた場合)。
session_set_cookie_params(int Lifetime [、string path [、string domain]])-この関数を使用すると、セッションの終了時刻を決定するunix_timestampを設定することにより、セッションの存続期間を設定できます。

PHPでセッション(セッション)を操作するための関数のリスト
session_cache_expire-現在のキャッシュの有効期限を返します
session_cache_limiter-現在のキャッシュ制限を取得および/または設定します
session_commit-session_write_close()のエイリアス
session_decode-文字列からセッションデータをデコードします
session_destroy-セッションに登録されているすべてのデータを破棄します
session_encode-現在のセッションデータを文字列として暗号化します
session_get_cookie_params-セッションCookieパラメータを取得します
session_id-現在のセッションIDを取得および/または設定します
session_is_registered-変数がセッションに登録されているかどうかを判別します
session_module_name-現在のセッションのモジュールを取得および/またはインストールします
session_name-現在のセッションの名前を取得および/または設定します
session_regenerate_id-現在のセッションIDを新しく生成されたもので変更します
session_register-現在のセッションの1つ以上の変数を登録します
session_save_path-現在のセッションを保存するためのパスを取得および/または設定します
session_set_cookie_params-セッションCookieパラメータを設定します
session_set_save_handler-ユーザーレベルのセッションストレージ関数を設定します
session_start-セッションデータを初期化します
session_unregister-現在のセッションから変数の登録を解除します
session_unset-すべてのセッション変数を解放します
session_write_close-セッションデータとセッションの終了を書き込みます

セッションの例

セッション中のページビューのカウンター。 仕事の実例。 ただし、ブラウザを閉じた後、カウントダウンは最初からやり直します。

1つのセッション内の1つのページへの訪問のカウンター

// Cookieなしでセッションを使用する簡単な例。
session_name( "test");
session_start();
$ _SESSION ["count"] = @ $ _ SESSION ["count"] + 1;
?>

カウンター


ブラウザを使用した現在の作業セッションで、このページを開きました
時間(秒)。
ブラウザを閉じて、このカウンタをリセットします。
ここをクリックしてページを更新してください!
遷移ごとに、カウンターは1)ずつ増加します。

ご清聴ありがとうございました! あなたの努力で頑張ってください!

セッションは実際には非常に単純です。 それらが何のためにあり、どのように配置されているかを理解する必要があります。 最初に最初の質問に答えましょう。
Webサーバーがサポートしていないことをご存知かもしれません 永続的な接続クライアントとの通信で、各リクエストは前のリクエストと通信せずに新しいリクエストとして処理されます。

つまり、同じ訪問者からのリクエストを追跡したり、ビュー間でその訪問者の変数を保存したりすることはできません。 個々のページ..。 セッションは、これら2つの問題を解決するために考案されました。
実際、セッションは、一言で言えば、ブラウザーを一意に識別し、サーバー上にこのブラウザー用のファイルを作成して、セッション変数を格納できるようにするメカニズムです。

このようなメカニズムの必要性については詳しく説明しません。 これらは、オンラインストアのショッピングカート、承認などの場合であり、たとえば、サイトのインタラクティブな部分をスパムから保護するなど、完全に些細な問題ではありません。

原則として、セッションの独自のアナログを作成するのは非常に簡単です。組み込みのPHPほど機能的ではありませんが、本質的には似ています。 クッキーとデータベースについて。

スクリプトをリクエストするとき、Cookieに特定の名前が付いているかどうかを確認します。 Cookieがない場合は、Cookieを設定し、ユーザーデータを含む新しい行をデータベースに書き込みます。 Cookieがある場合は、データベースから読み取ります。 もう1つのリクエストで、データベースから古いレコードを削除します。これで、セッションメカニズムの準備が整いました。 難しいことではありません。 ただし、組み込みのセッションメカニズムを使用することを推奨する微妙な違いがいくつかあります。

まず、何らかの方法でブラウザを識別する必要があります。 これを行うには、彼に与える必要があります 一意の識別子リクエストごとに送信するように依頼します。 認めるのは恥ずかしいことですが、セッションについて最初に知ったとき、これはある種の特別なメカニズムであり、ブラウザとサーバー間の新しい通信方法である「セッション」だと思いました。 セッション識別子が特別な方法で渡されること。 しかし、失望は残酷でした...

セッションは、データを転送するための標準的なよく知られた方法を使用します。 実際、他にはありません。
識別子は通常の変数です。 デフォルトでは、その名前はPHPSESSIDです。
PHPのタスクは、それをブラウザーに送信して、次のリクエストで返すことです。 すでに述べたFAQセクションから、変数はCookieまたはPOST / GETリクエストの2つの方法でのみ渡すことができることは明らかです。
PHPは両方のオプションを使用します。

php.iniの2つの設定がこれに関与しています。

session.use_cookies-1に等しい場合、PHPは識別子をCookieに渡します。0の場合、いいえ。
session.use_trans_sidが1の場合、PHPはそれを渡し、URLとフォームに追加します。0の場合、いいえ。

これらおよび他のセッションパラメータは、他のPHP設定と同じ方法で変更できます。php.iniファイル、およびini_set()コマンドまたはWebサーバー構成ファイルを使用します。

最初のものだけが有効になっている場合は、セッションの開始時(各呼び出し時) session_start())Cookieがクライアントに設定されます。 ブラウザは次のリクエストごとにこのCookieを正しく返し、PHPにはセッション識別子があります。 問題が始まるのは ブラウザのクッキー戻りません。 この場合、識別子付きのCookieを受信しないと、PHPは常に新しいセッションを開始し、メカニズムは機能しません。

2番目のみが有効になっている場合、Cookieは設定されません。 そして何が起こるかというと、そのために、基本的に、実際には、組み込みのセッションメカニズムを使用する価値があります。 スクリプトがその役割を果たし、ページが完全に形成された後、PHPはそれをすべて調べ、各リンクと各フォームにセッションIDを追加します。 これは次のようになります。

索引

になる

索引

隠しフィールドがフォームに追加されます

理論的には、Cookieとベースでの自家製セッションでは、IDの転送をすべてのリンクに手動で割り当てることができます。そうすれば、Cookieに関係なく独自のセッションが機能します。 しかし、ご覧のとおり、他の誰かがこれを実行すると、より快適になりますか? ;-)

最近のバージョンのPHPでは、両方のオプションがデフォルトで有効になっています。 PHPはこれをどのように処理しますか? クックは常に展示されています。 また、PHPがセッションIDを持つCookieを検出しなかった場合にのみ、リンクがオートコンプリートされます。 このセッション中にユーザーが初めてサイトにアクセスすると、Cookieがユーザーに配置され、リンクが追加されます。 次のリクエストで、Cookieがサポートされている場合、PHPはCookieを確認し、リンクの完了を停止します。 Cookieが機能しない場合、PHPは引き続きリンクにIDを適切に追加し、セッションが失われることはありません。
Cookieを使用しているユーザーには、IDの長いリンクが1回だけ表示されます。

識別子の転送が終了しました。 これで、サーバー側のデータを含むファイルをファイルにバインドする必要があります。 PHPがこれを行います。 書くだけで十分です:

session_start();
$ _SESSION ["test"] = "Hello world!" ;

そして、PHPはこのセッションに関連付けられたファイルにテスト変数を書き込みます。

ここには非常に重要な点があります。

配列 $ _SESSION- 特別な。
実際、その中には、さまざまなスクリプトで使用できるようにしたい変数があります。
セッションに変数を配置するには、変数を$ _SESSION配列の要素に割り当てるだけです。
その値を取得するには、同じ要素を参照するだけで十分です。 例を以下に示します。

ガベージコレクション-廃止されたものを削除する PHPファイル自分でもやっています。 また、データのエンコードやその他の必要なものもたくさんあります。 このケアの結果として、セッションでの作業は非常に簡単です。
ここに、実際、セッションの作業の例があります。
例は非常に小さいです:

session_start();

エコー 「このページを更新しました」..。 $ _SESSION ["counter"] ++。 " 一度。 " ;
エコー "
アップデート ";
?>

セッションにカウンター変数があるかどうかを確認し、ない場合は、値0で作成してから、その値を出力して1つ増やします。 増加した値はセッションに書き込まれ、次にスクリプトが呼び出されたときに、変数の値は1になります。 すべてがとてもシンプルです。

サイトの任意のページでセッション変数にアクセスするには、セッションが必要な各ファイルの先頭に1行だけ(!)を書き込む必要があります。

session_start();

session_start();
if($ _SESSION ["authorized"]<> 1 ) {
ヘッダー( "場所:/auth.php");
出口;
}

セッションから変数を削除します。 register_globals = offの場合は、次のように記述します。

unset($ _ SESSION ["var"]);

そうでない場合は、 近所のそれであなたは書く必要があります:

session_unregister( "var");

どのセッションを使用すべきか、何を使用すべきでないかを理解することは非常に重要です。

まず、セッションはユーザーが必要なときにのみ使用でき、邪魔にならないことを忘れないでください。 結局のところ、彼はいつでも識別子を取り除くことができます!
たとえば、スクリプトではなくフォームに入力することを確認する場合、ユーザー自身がセッションの動作に関心を持っています。そうしないと、フォームを送信できません。 しかし、スクリプトへの要求の数を制限するために、セッションはもはや適切ではありません-悪意のあるスクリプトは単に識別子を返しません。

第二に。 セッションは、人が理解しているように、サイトを操作するセッションであるという事実を明確に理解することが重要です。 来て、働いて、ブラウザを閉じました-セッションは終了しました。 映画のセッションのように。 別のチケットを見たい場合は、新しいチケットを購入してください。 新しいセッションを開始します。 これについての技術的な説明もあります。 セッションメカニズムは、ブラウザが閉じられるまでのみ機能することが保証されています。 結局のところ、Cookieはクライアントに対して機能しない可能性があり、この場合、もちろん、識別子が追加されたすべてのリンクは、閉じられると消えます。

ただし、ブラウザを閉じないとセッションが失われる可能性があります。 この記事で説明されている制限により、セッションエンジンは、ユーザーがブラウザを閉じたことを検出できません。 このために、タイムアウトが使用されます。これは、ユーザーがサイトを離れたと見なされる所定の時間です。 デフォルトでは、このパラメーターは24分です。

ユーザー情報を長期間保存する場合は、Cookieを使用し、必要に応じてサーバー上のデータベースを使用します。 特に、これはすべての一般的な認証システムがどのように機能するかです。

ユーザーが識別されると、セッションが開始され、認証のサインがセッションで送信されます。
-ユーザーを「記憶」する必要がある場合は、ユーザーを識別するCookieがユーザーに設定されます。
-ユーザーが次にサイトにアクセスするときにログインするには、パスワードを入力するか、システム自体が以前に設定したCookieによってパスワードを認識し、セッションが開始されます。 古いセッションを継続するのではなく、新しいセッション。

第三に、サイトに入るすべての人にとって、無差別にセッションを開始する価値はありません。 これにより、完全に不要な負荷が発生します。 ささいなことのためにセッションを使用しないでください-例えば、カウンターで。 もちろん、spilogueがセッションを呼び出すものは、呼び出し統計に基づいてカウントされ、PHPのようなセッションメカニズムを使用しません。

さらに、あなたのサイトにインデックスを付ける検索エンジンを取り上げましょう。 検索ロボットがCookieをサポートしていない場合、PHPはデフォルトでリンクにPHPSESSIDを提供します。これは、検索エンジンの好みに合わない可能性があります。噂によると、動的リンクは好まれませんが、ここでは一般的に、呼び出しごとに-新しいアドレス!

セッションを使用してサイトの閉じたセクションへのアクセスを制限する場合、すべてが単なる検索エンジンであり、インデックスを作成しないでください。 許可されたユーザーと許可されていないユーザーの両方に同じページを表示する必要がある場合、このトリックはここで役立ちます-パスワードを入力したユーザー、またはすでにセッションを開始したユーザーのみにセッションを開始します。

これを行うには、各ページの最初に、 session_start()私達は書く:

if(isset($ _ REQUEST [session_name()]))session_start();

したがって、識別子を送信した人だけにセッションを開始します。
したがって、承認時に初めてユーザーに送信する必要があります。

名前と小屋が正しい場合-書く session_start() !

PHPがセッションを操作しようとしたときに発生する最も一般的なエラーは、次のとおりです。
それらのうちの2つ、

警告:セッションCookieを送信できません-ヘッダーはすでに送信されています
警告:セッションキャッシュリミッターを送信できません-ヘッダーはすでに送信されています

同じ理由で、解決策はこの事実で説明されています

警告:開く(/ tmp \ sess_SID、O_RDWR)に失敗しました:行番号のfull_script_pathにそのようなファイルまたはディレクトリ(2)がありません

以前は彼女は次のように見えました

警告:セッションデータ(ファイル)の書き込みに失敗しました。 session.save_pathの現在の設定が正しいことを確認してください(/ tmp) ,

英語から翻訳すると、問題が詳細に説明されます。php.iniで指定されている、セッションファイルが書き込まれるディレクトリへのパスが使用できません。 このエラーは最も簡単に修正できます。 たとえば、存在して書き込み可能なディレクトリを作成するだけです。

session.save_path = c:\ windows \ temp

その後、Apacheを再起動することを忘れないでください。

結局のところ、人間の知性には限界がないので、私は説明する必要があります:
エラーメッセージはブラウザに出力され、その後はヘッダーを使用できないため、3番目のエラーメッセージ(ディレクトリが見つかりません)は最初の2つにつながります。 したがって、早すぎる結論を探すために急いではいけませんが、最初に正しいパスを書いてください!

セッションを処理する際の次の最も一般的な問題は、register_globalsの重い遺産です。 スクリプト変数に$ _SESSION配列のインデックスと同じ名前を付けないでください。

register_globals = onの場合、値は互いに上書きされ、混乱します。

それが機能しないが、メッセージも表示されない場合は、スクリプトの最初に、画面にすべてのエラーを表示する責任がある2行を追加します-エラーがある可能性は十分にありますが、単に表示されません彼ら。

ini_set( "display_errors"、1);
error_reporting(E_ALL);

またはerror_logのエラーを参照してください。 一般に、エラーメッセージの表示に関するトピックはこの記事の範囲を超えているため、少なくともエラーメッセージが表示されることを確認してください。 このセクションでは、トラブルシューティングの詳細をもう少し読むことができます。

エラーがないことは確かですが、指定された例がとにかく機能しない場合は、PHPがURLを介したIDの転送を有効にしていない可能性があります。 と何らかの理由でクッキーが機能しない.
あなたがクッキーで持っているものを見てください。

一般に、セッションが「機能しない」場合は、最初にセッションIDを手動で転送するか、リンクを作成してIDを割り当てます。

session_start();
if(!isset($ _ SESSION ["counter"]))$ _SESSION ["counter"] = 0;
エコー 「このページを更新しました」..。 $ _SESSION ["counter"] ++。 " 一度。

アップデート ";
?>

これを行うときは、session.use_only_cookiesディレクティブが有効になっていないことを確認してください。これにより、PHPがURLを介して渡された場合にセッションIDを受け入れることができなくなります。

この例が機能しない場合、問題は平凡なものにあります タイプミス(セッションの「問題」の半分は、変数名のつづりの間違いに起因します)、またはPHPの古すぎるバージョン:セッションのサポートはバージョン4.0で登場し、配列 $ _SESSION-4.1で(以前に使用された $ HTTP_SESSION_VARS).

それが機能する場合、問題はCookieにあります。 追跡-ブラウザがブラウザに返すかどうかにかかわらず、サーバーがブラウザにどのような種類のCookieを配置するか。 ブラウザとサーバー間のHTTPヘッダー交換を見ながら、検索は非常に便利です。

Cookieがどのように機能するかを説明することは、これや多くのテキストの範囲を超えていますが、少なくともサーバーが識別子を使用してCookieを送信し、ブラウザーが戻ることを確認してください。 そして、識別子が互いに一致している間=)
Cookieの設定は次のようになります

Set-Cookie:PHPSESSID = prlgdfbvlg5fbsbshch6hj0cq6;

Set-Cookie:PHPSESSID = prlgdfbvlg5fbsbshch6hj0cq6; パス= /

(ルートディレクトリからではなくスクリプトを要求している場合)
サーバーの応答は次のようになります

クッキー:PHPSESSID = prlgdfbvlg5fbsbshch6hj0cq6

クッキー:PHPSESSID = prlgdfbvlg5fbsbshch6hj0cq6; b = b

ブラウザがセッションID以外のCookieを返した場合。

ここの例が機能するが、独自のコードが機能しない場合、問題は明らかにセッションではなく、アルゴリズムにあります。 変数を失った場所を探し、ここから例を段階的に転送し、スクリプトをデバッグします。

ヘッダーリダイレクトまたはJavaScriptナビゲーションを使用している場合は、別の問題が発生する可能性があります。
事実、PHPはフォームのリンクにのみセッション識別子を自動的に追加します
、ただし、ヘッダー、javascript、メタタグに対してはこれを行いません。

したがって、たとえば次のように、識別子を手動で追加する必要があります。

ヘッダー( "場所:/script.php?"。session_name()。 "="。session_id());

また、非常にまれであり、問​​題の原因が完全に不明である場合、問題は、session.save_handler設定にファイル以外の値があることです。 そうでない場合は、修正してください。

  • Cookieに加えて、セッションメカニズムは、ページキャッシュを禁止するヘッダー(同じキャッシュリミッター)も送信します。 htmlの場合、これは正しく、必要です。 ただし、認証を確認するスクリプトを使用してファイルを送信しようとすると、InternetExplorerはそのファイルのダウンロードを拒否します。 このタイトルのせいです。 電話
    session_cache_limiter( "private");
    セッションを開始する前に問題を解決する必要があります。
  • 奇妙なことに、しかし配列内 $ _SESSION数値インデックスは使用できません- $ _SESSION [1]、$ _ SESSION ["10"]-セッションは機能しません。
  • 4.2から5.0の間のどこかで、session.use_trans_sidをで設定することができませんでした ini_set()..。 5.0から、それはすでに再び可能です。
  • バージョン4.3.3より前のCookiePHPは、セッションの開始時にリクエストに識別子が含まれていなかった場合にのみCookieを送信していました。 これで、すべての通話でCookieが送信されます session_start

    他にご不明な点がある場合や不明な点がある場合は、ようこそ

当初から、誰もがPHPを大成功で受け入れましたが、この言語で十分な大きさのプロジェクトを作成し始めるとすぐに、開発者は新しい問題に直面しました。PHPにはグローバル変数の概念がありませんでした。 つまり、スクリプトが実行され、生成されたページがクライアントに送信され、このスクリプトで使用されていたすべてのリソースが破棄されました。 説明のために、同じサイトにindex.phpとdothings.phpの2つのページがあるとします。 これらのページのソースは次のようになります。

index.php dothings.php

これらの2つのスクリプトを実行すると、最初のページに「私はindex.phpに割り当てられました」という碑文が表示され、2番目のページは空になります。

Webサイト開発者は、ためらうことなく、Cookieを使用してクライアント側にグローバル変数を格納し始めました。 プロセスは次のようになりました。ユーザーがサイトのメインページにアクセスし、何らかのアクションを実行すると、サイトの他のページで必要になる可能性のあるこのユーザーに関連するすべての情報が、ブラウザに次の形式で保存されます。クッキー。 この方法にはかなり深刻な欠点があります。そのため、多くの開発者が一度にPHPに背を向けました。 たとえば、ユーザーがサイトの制限された(または自分だけの)セクションにアクセスできるようにする必要があります。 ユーザーにCookieを送信する必要があります。これは、サイトでの後続の識別子として機能します。 このアプローチは、サイトがユーザーの行動に関する情報を収集し始めるとすぐに非常に面倒で不便になります。ユーザーに送信されるすべての情報は、偽造できないようにエンコードすることが望ましいためです。 最近では、Cookieを偽造することで、複数のチャットを「スタック」することが可能になり、場合によっては他の誰かのメールに侵入することさえ可能になりました。 さらに、ブラウザがCookieをサポートしていない奇妙な人々がまだ世界にいます。

セッションメカニズムの構造に関する技術的な問題については説明しませんが、PHPでセッションを適切に操作する方法についてのみ説明します。

セッションの操作方法は?

商用ホスティングで記​​事(またはスクリプト)の例をテストする場合、セッションの操作に問題はないはずです。 サーバーを自分でセットアップした場合(実サーバーまたはエミュレーター)、次の内容のエラーが表示される場合があります。

「警告:オープン(/ var / state / php / sess_6f71d1dbb52fa88481e752af7f384db0、O_RDWR)が失敗しました:そのようなファイルまたはディレクトリはありません(2)」。

これは、PHPが正しく構成されていないことを意味します。 この問題を解決するには、(既存のディレクトリへの)正しいパスを書き込んでセッションをphp.iniファイルに保存し、サーバーを再起動します。

セッションの変数(データ)を使用するスクリプトには、次の行を含める必要があります。

Session_start();

このコマンドは、指定されたページが指定されたユーザー(ブラウザー)に関連付けられているすべての変数を必要としていることをサーバーに通知します。 サーバーはこれらの変数をファイルから取得し、使用可能にします。 データがユーザーに送信される前にセッションを開くことが非常に重要です。 実際には、これは、ページの最初でsession_start()関数を呼び出すことをお勧めすることを意味します。次に例を示します。

Session_start(); ?> ...セッションファイルを保存するディレクトリを設定するには、session_save_path()関数を使用します。session_save_path($ _ SERVER ["DOCUMENT_ROOT"]。 "/ Session"); session_start();

セッションが開始されると、グローバル変数を設定できます。 $ _SESSION配列の任意のフィールドに値を割り当てると、同じ名前の変数がセッション変数として自動的に登録されます。 この配列は、セッションを使用するすべてのページで使用できます。 たとえば、プログラムを分析してみましょう。

index.php 大丈夫。 セッションがロードされました! 通過してみましょう、そこに何があるか見てみましょう: dothings.php

これらのファイルを順番に実行すると、最初の「index.php」スクリプトは次の結果を生成します。

大丈夫。 セッションがロードされました! 通過してみましょう、そこに何があるか見てみましょう:

そして2番目の「dothings.php」はこれです:

index.phpで尋ねられました

$ a変数は、セッションを開始したこのサイトのすべてのページで使用できるようになりました。

セッションを操作するための他の便利な機能とテクニック:

  • 未設定($ _ SESSION ["a"])-セッションは、セッションによって設定された変数の値を「忘れる」。
  • session_destroy()-セッションが破棄されます(たとえば、ユーザーが「終了」ボタンを押してシステムを離れた場合)。
  • session_set_cookie_params(int Lifetime [、string path [、string domain]])-この関数を使用すると、セッションが「終了」する時間を決定するunix_timestampを設定することにより、セッションが「存続」する期間を設定できます。 デフォルトでは、セッションはクライアントがブラウザウィンドウを閉じるまで「存続」します。
  • session_write_close()-セッション変数を記録して閉じます。 これは、ページが長い処理を実行していて、ブラウザのセッションファイルをブロックしている場合に、新しいウィンドウでサイトを開くために必要です。

の例

それでは、セッションメカニズムの実際のアプリケーションに移りましょう。 ここでは、かなり単純でありながら便利な例をいくつか見ていきます。

ユーザー認証

PHPセッションを使用したユーザー認証に関する質問は、Webプログラミング会議で常に尋ねられます。 セッションを使用してシステム内のユーザーを承認するメカニズムは、セキュリティの観点から非常に優れています(セクションを参照)。

この例は、index.php、authorize.php、secretplace.phpの3つのファイルで構成されます。 index.phpファイルには、ユーザーがユーザー名とパスワードを入力するフォームが含まれています。 このフォームは、authorize.phpファイルにデータを渡します。これにより、承認が成功した場合、ユーザーはsecretplace.phpファイルにアクセスできるようになり、それ以外の場合はエラーメッセージが表示されます。

例: index.php パスワードを入力してください

ログイン:
パスワード:
authorize.php ページ...ヘッダー( "場所:secretplace.php"); 出口; ))//何か問題があった場合、ユーザーは//エラーメッセージを受け取ります。 ?> 間違ったパスワードを入力しました! secretplace.php おい、、あなたは秘密のページにいます!!! :)

安全

そのため、あるページ(PHPスクリプト)から別のページ(サイトからの次の呼び出しまで)に識別子を転送できます。つまり、すべてのサイト訪問者を区別できます。 セッション識別子は非常に大きな数(128ビット)であるため、ブルートフォースになる可能性はほとんどありません。 したがって、攻撃者には次のオプションが残されます。

  • ユーザーのコンピューターに、セッション番号を盗むトロイの木馬があります。
  • 攻撃者は、ユーザーのコンピューターとサーバーの間のトラフィックをキャッチします。 もちろん、安全な(暗号化された)SSLプロトコルがありますが、誰もがそれを使用しているわけではありません。
  • 隣人がユーザーのコンピューターに近づき、セッション番号を盗みました。

誰かが誰かから何かを盗むという事実に基づくそのような状況は、一般に、プログラマーの能力の範囲内ではありません。 これは、管理者とユーザー自身が対処する必要があります。

ただし、PHPはしばしばだまされる可能性があります。 ユーザー認証プログラムで考えられるハッキングポイントを見てみましょう。

  • ファイルauthorize.php-サードパーティのスクリプトを使用してパスワードを推測する試み。
  • secretplace.phpファイルは、ブラウザのアドレスバーに$ logged_user変数の値を入力してプログラムをだまそうとする試みです。例:
    「http://www.yoursite.ru/secretplace.php? Logged_user =ハッカー"

したがって、私たちのプログラムでは、2つの「穴」がはっきりと見えます。1つは小さく、特に目立たないものですが、2つ目は単純に巨大で、ほとんどのハッカーは必要のない場所に登ります。

穴番号1を「パッチ」する方法は?

IPアドレスなどをブロックするコードを大量に作成するのではなく、リクエストがどこから来たのか、またはリクエストがどのページから来たのかを確認するだけです。サイトのページであれば、すべて問題ありませんが、他のすべての場合、私たちはそれを入れません。 authorize.phpファイルを修正しましょう:

authorize.php V2 ページ...ヘッダー( "場所:secretplace.php"); 出口; )))?> 間違ったパスワードを入力しました!
「穴」番号2を取り除く方法は?

すべての定命の者がフォーラムに投稿するために登録できるWebサイトがあるとします。 当然、フォーラムでは、一部のユーザー(管理者、モデレーター)が他のユーザーよりも多くの機会を持っています。たとえば、他のユーザーからのメッセージを削除できます。 ユーザーアクセスレベルは、セッションの$ user_status変数に格納します。ここで、$ user_status = 10はに対応します。 全権アクセスシステムに。 サイトにアクセスした攻撃者は、通常の方法で登録してから、ブラウザのアドレスバーに追加する必要があります。 ?user_status = 10..。 だからあなたはあなたのフォーラムに新しい管理者を持っています!

基本的に、任意のスクリプト変数はを介して設定できます アドレスバースクリプトの完全なアドレスの後に疑問符と変数の名前とその値を追加するだけです。 これを回避するためにコードを修正しましょう:

secretplace.php V2 変数が設定されていません($ _ SESSION ["logged_user"]); //セッションを開きますsession_start(); / *このページに移動することはできません...ユーザー名が登録されていない場合は、index.phpページにリダイレクトしてログインとパスワードを入力します...実際、ここでは多くのことができます。たとえば、ユーザーのIPを覚えておいて、3回目のファイルへのアクセスを試みた後、それをブロックします。 * / if(!isset($ _ SESSION ["logged_user"]))(header( "Location:index.php"); exit;)?> おい、、あなたは秘密のページにいます! 結果

セッションメカニズムはかなりクールな機能です PHP言語..。 セッションはシンプルで、非常に柔軟に使用できます。 ちなみに、めったに文書化されていない機会が1つあります PHPセッション(バージョン4.0.3以降で使用可能)-変数だけでなく、オブジェクトもセッションに保存できます。

の例

?>
//リンクへのSIDの自動挿入。 ini_set( "session.use_trans_sid"、true); session_start(); ?> ここをクリック!
ここをクリック !!

//セッションの操作例。 session_start(); //サイトにアクセスしたばかりの場合は、カウンターをリセットします。 if(!isset($ _ SESSION ["count"]))$ _SESSION ["count"] = 0; //セッションのカウンターを増やします。 $ _SESSION ["count"] = $ _SESSION ["count"] + 1; ?>

カウンター

時間(秒)。
ブラウザを閉じて、カウンタをリセットします。
"target =" _ blank ">子ブラウザウィンドウを開きます。
// Cookieなしでセッションを使用する簡単な例。 session_name( "test"); session_start(); $ _SESSION ["count"] = @ $ _ SESSION ["count"] + 1; ?>

カウンター

ブラウザを使用した現在の作業セッションで、このページを開きました時間(秒)。
ブラウザを閉じて、このカウンタをリセットします。
?">ページを更新するには、ここをクリックしてください。

セッションは、一意のセッションIDを持つ個々のユーザーの情報を保存する簡単な方法です。 これは、ページ要求間で状態を永続化するために使用できます。 セッションIDは通常、セッションCookieを介してブラウザに送信され、使用可能なセッションデータを取得するために使用されます。 セッションIDまたはセッションCookieがない場合、PHPは新しいセッションを作成して新しいセッションIDを生成するように指示されます。

セッションは単純なテクノロジーを使用します。 セッションが作成されると、PHPは渡された識別子(通常はセッションCookieから)を使用して既存のセッションを取得するか、何も渡されなかった場合は新しいセッションが作成されます。 PHPは、セッションの開始後に$ _SESSIONスーパーグローバルにセッション情報を入力します。 PHPが終了すると、$ _SESSIONスーパーグローバルのコンテンツが自動的にシリアル化され、セッションハンドラーを使用してストレージに送信されてセッションが記録されます。

デフォルトでは、PHPは内部ファイルハンドラーを使用してセッションを保存します。これは、session.save_handlerINI変数で設定されます。 このハンドラーは、サーバー上のsession.save_path構成ディレクティブで指定されたディレクトリーにデータを保存します。

機能を使用して手動でセッションを開始できます session_start()..。 session.auto_startディレクティブが1に設定されている場合、セッションはリクエストの開始時に自動的に開始されます。

通常、セッションはPHPがスクリプトの実行を終了すると終了しますが、関数を使用して手動で終了することもできます。 session_write_close().

警告

注意

コメント:

ファイルを使用するセッション(PHPのデフォルト)は、関数でセッションを開くとすぐにセッションファイルをブロックします session_start()または、session.auto_startを指定して間接的に。 ブロックした後、他のスクリプトは、閉じられるか、スクリプトが終了するか、関数が呼び出されるまで、同じセッションファイルにアクセスできません。 session_write_close().

これは、AJAXを多用し、複数の同時リクエストを行うサイトで問題になる可能性が最も高くなります。 この問題を解決する最も簡単な方法は、関数を呼び出すことです session_write_close()セッションで必要なすべての変更が行われるとすぐに、できればスクリプトの開始に近づきます。 並行性をサポートする別のセッションメカニズムを使用することもできます。

理由はわかりませんが、すべて/グーグルの回答を試しました..何も見つかりませんでした。 状況は次のとおりです。

ローカルホストコード

結果:

アプリページ間およびページの更新時のシーケンシャルsession_id()。 $ _COOKIE ["PHPSESSID"]はsession_id()と一致します

ダイレクトサーバー

Session_start(); エコーsession_id(); print_r($ _ COOKIE ["PHPSESSID"]);

結果:

session_id()は、リクエスト、ページのリロード、または別のページへのアクセスごとに変更されます。 $ _COOKIE ["PHPSESSID"]はNULL /空です。 同じコードがページの上部で使用されています。 他のコンテンツはありません。

この問題は私に本当の頭痛の種を与えました、どのような種類のサーバー構成またはエラーがこれを引き起こしている可能性がありますか? PHPSESSID Cookieが空であるのはなぜですか。これは、関連付けられたsession_id()がリクエストごとにリセットされるためだと思いますか?

助けてくださいみんな!

編集:ローカルリモートサーバー上に3行の簡単なテストファイルを作成しました。 それは私のコードとは関係ありません。 $ _COOKIE ["PHPSESSID"]はまだ空であり、更新のたびに実際のホストで新しいsession_id()が発生します。

error_reporting SET TO ALLライブホストでこれを取得します:

注意:未定義のインデックス:5行目の/home/vivaplug/public_html/dev/wp-content/plugins/test.phpのPHPSESSID

GoogleChromeヘッダー

ローカルホスト

リクエストURL:http://localhost/wp-content/plugins/test.phpリクエストメソッド:GETステータスコード:200 OKリクエストヘッダービューソース受け入れ:テキスト/ html、アプリケーション/ xhtml + xml、アプリケーション/ xml; q = 0.9、 image / webp、* / *; q = 0.8 Accept-Encoding:gzip、deflate、sdch Accept-Language:en-US、en; q = 0.8 Cache-Control:no-cache接続:keep-alive Cookie:PHPSESSID = 68b7m4arpsacks4aetgmd3rs93ホスト:localhostプラグマ:キャッシュなしユーザーエージェント:Mozilla / 5.0(Windows NT 6.1)AppleWebKit / 537.36(KHTML、Geckoなど)Chrome / 30.0.1599.101 Safari / 537.36応答ヘッダービューソースキャッシュコントロール:no-store、no-キャッシュ、再検証が必要、チェック後= 0、チェック前= 0接続:Keep-Aliveコンテンツタイプ:テキスト/ html日付:2013年11月5日火曜日07:10:51 GMT有効期限:1981年11月19日木曜日08 :52:00 GMTキープアライブ:タイムアウト= 5、最大= 100プラグマ:キャッシュなしサーバー:Apache / 2.4.4(Win32)PHP / 5.4.16転送エンコーディング:チャンクX-Powered-By:PHP / 5.4 .16

サーバーを削除する

リクエストURL:http://vivaplugins.com/dev/wp-content/plugins/test.phpリクエストメソッド:GETステータスコード:200 OKリクエストヘッダービューソース受け入れ:text / html、application / xhtml + xml、application / xml; q = 0.9、image / webp、* / *; q = 0.8 Accept-Encoding:gzip、deflate、sdch Accept-Language:en-US、en; q = 0.8 Cache-Control:max-age = 0 Connection:keep-生きているホスト:vivaplugins.comユーザーエージェント:Mozilla / 5.0(Windows NT 6.1)AppleWebKit / 537.36(KHTML、Geckoなど)Chrome / 30.0.1599.101 Safari / 537.36応答ヘッダービューソース年齢:0キャッシュ制御:no-store、no -cache、must-revalidate、post-check = 0、pre-check = 0 Content-Encoding:gzip Content-Type:text / html Date:Tue、05 Nov 2013 07:07:49 GMT Pragma:no-cache Server: http://www.unixy.net/varnishによる高度なホスティングTransfer-Encoding:chunked Vary:Accept-Encoding Via:1.1 varnish X-Cache:HIT X-Cache-Hits:2 X-Cacheable:YES X-Powered-By :PHP / 5.4.20 X-Varnish:1984840969 1984839805