この記事では、PHP5 ノート (COOKIE と SESSION) の解決策を紹介します (共有)。このアプリケーションには一定の参考値があります。困っている友人はそれを参照できます。皆様のお役に立てれば幸いです。
#1. HTTP プロトコル自体はステートレスです。
私たちは皆、インターネットをサーフィンするときに HTTP プロトコルに依存して情報を送信します。たとえば、ブラウザに URL www.bokee.com を入力して Enter キーを押すと、URL が http://www.bokee.com になることがわかります。これは、閲覧している Web ページが次のとおりであるためです。 http プロトコルに基づいています。 http プロトコルでは、ユーザーがどの Web サイトによくアクセスするか、どのような趣味を持っているかを記録することはできません。また、ユーザーの ID アカウントとパスワードを記録することもできません。これは、HTTP プロトコルのいわゆるステートレス性です。 HTTP プロトコル自体はステートレスであり、これは HTTP プロトコルの本来の目的と一致しています。クライアントはサーバーに特定のファイルのダウンロードを要求するだけで済みます。クライアントもサーバーも、お互いの過去のアクションを毎回記録する必要はありません。顧客と自動販売機や通常の (非会員制) ハイパーマーケットとの関係と同じように、リクエストはすべて独立しています。
2. Cookie とセッションを理解するにはどうすればよいですか?
Cookie とセッションは密接な関係があるため、ここではまとめて紹介します。
例: 河南省にいたとき、よくデリに行って食いしん坊のアヒルを買いましたが、店のオーナーは販売促進のために「アヒルを 10 羽購入するごとに無料でプレゼントします」という特別プロモーションを出しました。 」。自宅での結婚式やお葬式を除けば、鴨のローストを一度に10個も買う人はいないでしょう?そこで、上司は顧客の消費量を記録する方法を考えなければなりません。選択肢は 3 つあります:
Ⅰ. 上司は各顧客の消費量を記憶し、顧客が 10 個消費すると自動的に 1 個を顧客に渡します。 。これは、HTTP プロトコル自体がステートフルであり、顧客の アクティビティ 行動を記憶できるのと似ています。しかし、残念ながら、さまざまな考慮事項により、http プロトコル自体はステートフルであることができず、ボス自身もそれほど特別な記憶力を持っていないため、この解決策は機能しません。
Ⅱ. 上司は顧客にポイントカードを発行しますが、これには消費額が記録され、通常は有効期限があります。ローストダックを購入する際、顧客がこのカードを提示すると、上司はその顧客が以前にその店を訪れたことがあることを知ることができます。このアプローチは、Cookie テクノロジーなど、クライアント側で状態を維持することです。 (Windows システム) C:\Documents and Settings\Username\Cookies を開くと、*.txt 形式の小さなファイルがいくつか見つかります。これは、一部の Web サイトを閲覧したときに送信される「ポイント カード」 (Cookie) です。
Ⅲ. ボスは顧客に会員カードを発行し、カード番号以外の情報は記録しません。顧客がローストダックを購入するたびに、顧客がカードを提示すると、ボスは店の名簿から移動し、カードを見つけます数値を入力して1点を加算します。このアプローチは、サーバー側で状態を維持することです。
これはセッションテクノロジーのようなものです。
Cookie とセッションの最大の違いは、Cookie は顧客に送信されるポイントカードであり、顧客のすべての消費情報を記録します。セッションは、カード番号(セッションID)のみを記載したポイントカードを顧客に発行し、顧客のあらゆる消費情報を記録します。 Cookie はクライアント側に保存され、セッションはサーバー側に保存され、セッション ID はクライアント側に保存されます。これらは通常、小さな Cookie ファイルでもあります。この小さなファイルにはセッション ID (カードなど) 以外は何も含まれていないため、番号)、クッキーよりも優れており、はるかに安全です。
3. Cookie とセッションは何に使用されますか?
一部の Web サイトからダウンロードするなどの一般的な使用方法では、メンバーが最初にログインする必要があります。 http プロトコル自体はステートレスなので、顧客がログインしたかどうかを知る方法がありません。どうすればよいですか? Cookie やセッションを通じてそれを知ることができます。もう 1 つの例はオンライン ショッピングですが、ショッピング カートは顧客が選択した商品をどのようにして知るのでしょうか? Cookie とセッションを記録することもできます。つまり、Cookie とセッションは顧客のステータスを記録できる技術であり、異なる技術ではありますが、Cookie ができる限り、セッションでも記録できます。 ##################クッキー ##################
1. Cookie とは何ですか?
0Cookie テクノロジーは非常に物議を醸すテクノロジーであり、その誕生以来、大多数の ネットワーク ユーザーと Web 開発者にとって議論の焦点となってきました。一部の上級 Web 専門家を含む一部のインターネット ユーザーは、Cookie テクノロジーの機能が弱すぎるため、またはその他の技術的なパフォーマンス上の理由からではなく、単に Cookie の使用が害を引き起こすと感じているため、その作成と宣伝に不満を抱いています。ネットワークユーザーのプライバシーに影響します。 Cookie は Web サーバーによってユーザーのブラウザに保存される小さなテキスト ファイルであるため、ユーザーに関する情報 (識別番号、パスワード、ユーザーが Web サイトで購入した方法、ユーザーが購入した回数など) が含まれています。サイトにアクセスします)。
それでは、Cookie テクノロジーとは一体何なのでしょうか?それは本当にインターネット ユーザーの個人的なプライバシーに害をもたらすのでしょうか?回答する前に以下の内容を読んでみましょう。
WEB 技術開発の歴史において、Cookie 技術の登場は大きな変化です。まず、Netscape が Netscape Navigator ブラウザに Cookie テクノロジを導入し、それ以来、World Wide Web Association が Cookie 標準のサポートを開始しました。その後、Microsoft (Microsoft の IIS Web サーバーで使用される ASP テクノロジは Cookie テクノロジを多用しているため)、つまり Microsoft の ## によって精力的に推進されました。 #Internet Explorer ブラウザは Cookie テクノロジーを完全にサポートしています。これまでのところ、ほとんどのブラウザは Cookie テクノロジーをサポートしているか、少なくとも Cookie テクノロジーの使用と互換性があります。 Netscape の公式ドキュメントの定義によると、Cookie はサーバーまたはスクリプトが HTTP プロトコルの下でクライアントのワークステーション上の情報を維持するための方法です。 Cookie は、Web サーバーによってユーザーのブラウザに保存される小さなファイルであり、ユーザーに関する情報 (識別番号、パスワード、ユーザーが Web サイトで購入する方法、ユーザーがサイトを訪問した回数など) が含まれる場合があります。ユーザーがサーバーに接続するたびに、Web サイトは Cookie 情報にアクセスできます。
Windows システムを使用している場合は、C:\Documents and Settings\Username\Cookies を開くと、このディレクトリに *.txt 形式の小さなファイルが多数あることがわかります。それがクッキーファイルです。もちろん、システムを新しくインストールしたか、インターネットを閲覧したことがないか、ブラウザの Cookie が無効になっているため、このディレクトリには何も見つからない可能性があります。そうしないと、このディレクトリには常に何かが存在します。
平たく言えば、ブラウザは Cookie をサポートするために 1 つ以上の限定されたファイルを使用します。これらのファイルは、Windows オペレーティング システムを使用するマシンでは Cookie ファイルと呼ばれ、Macintosh マシンではマジック Cookie ファイルと呼ばれ、Web サイトで Cookie データを保存するために使用されます。 Web サイトはこれらの Cookie ファイルに情報を挿入することがあり、一部のインターネット ユーザーに副作用が生じる可能性があります。一部のユーザーは、これが個人のプライバシーの侵害を引き起こすと信じており、さらに悪いことに、Cookie は個人空間の侵害であり、ユーザーのコンピュータにセキュリティ上の危険を引き起こす可能性があると信じています。
現在、一部の Cookie は一時的なものであり、その他は永続的なものです。一時 Cookie は指定された期間のみブラウザに保存され、指定された期間が経過すると、Cookie はシステムによって消去されます。たとえば、
PHP では、ユーザーが Web サイトを離れるまでユーザーの進行状況を追跡するために Cookie が使用されます。永続的な Cookie はユーザーの Cookie ファイルに保存され、次回ユーザーが戻ったときにも呼び出すことができます。 Cookie を Cookie ファイルに保存する ユーザーの中には、これが大きな問題を引き起こすと考えすぎる人もいます。その主な理由は、一部のユーザーが、ユーザーがどの種類のサイトを訪問するのが好きか、どのようなアクティビティに参加するのが好きかなど、ユーザーのオンラインサーフィンの習慣が Cookie によって追跡されるのではないかと懸念しているためです。この種の個人情報が下心を持つ一部の人々の手に渡れば、その個人は大量の広告ゴミの
対象 になったり、偶発的な被害に遭ったりする可能性があるのではないかと心配しています。ダメージ。しかし、Webサイト外のユーザーはWebサイト全体のCookie情報を取得することができないため、そのような心配は全くありません。したがって、この目的で Cookie を使用することは不可能です。しかし、一部のユーザーの誤解や「誤った噂」のため、一部のブラウザ開発者は適切に対応せざるを得ません (たとえば、Netscape Navigator 4.0 と Internet Explorer 3.0 はどちらも Cookie をブロックするオプションを提供しています)。個人的には、火のないところに煙は立たないと思います。Web サイトのプログラマーが厳密な思考を持っていない場合、Cookie にはセキュリティ上の問題がいくつかあります。しかし、これらの欠陥は、Cookie の優れた品質を覆い隠すのに十分ではありません。ほとんどの人は、依然として満足しています。それらを使用してください。 Cookie テクノロジを長い間待ち望んでいた結果、多くのブラウザ開発者はブラウザ内で Cookie を柔軟に制御することを余儀なくされました。たとえば、現在主流の 2 つのブラウザである Netscape Navigator と Internet Explorer は、次の方法で Cookie を処理します。Netscape Navigator 4.0 は警告のために Cookie を受け入れるだけでなく、Cookie をブロックすることもできます。Internet Explorer 3.0 も Cookie をブロックできますが、Internet Explorer 4 では Cookie をブロックできます。 0 では、ブロック オプションを提供せずに警告のみを受け入れることができますが、Internet Explorer 4.0 以降の更新バージョンでは、Cookie をブロックするオプションが追加されました。
さらに、最新のテクノロジーの多くは、Cookie をブロックできないブラウザでも Cookie をブロックできます。たとえば、Cookie ファイルをさまざまなタイプに設定することで、Cookie の使用を制限できます。ただし、残念ながら、Cookie を完全にブロックしたい場合は、多くのサイト ページが確実に拒否されることになります。なぜなら、今日、多くの Web サイト開発者が Cookie テクノロジの強力な機能に夢中になっているためです。たとえば、Session オブジェクトの使用と Cookie のサポートを切り離すことはできません。
2. Cookie はどのように機能しますか?
顧客が PHP テクノロジに基づいた Web サイトにアクセスすると、PHP の setcookie 関数を使用して Cookie を生成できます。処理後、システムは Cookie をクライアントに送信し、C:\Documents に保存します。設定\ユーザー名\Cookies ディレクトリ。 Cookie は HTTP ヘッダーの一部であるため、何かをブラウザーに送信する前に setcookie 関数を呼び出す必要があります。この制限は header() 関数と同じです (head() 関数を理解する必要がある場合は、自分で確認してください)。お客様が再度 Web サイトを訪問すると、ブラウザは C:\Documents and Settings\Username\Cookies ディレクトリ内のサイトに対応する Cookie をサーバーに自動的に送信し、サーバーはクライアントから送信された Cookie を自動的に変換します。 PHP 変数。 PHP5 では、クライアントから送信された Cookie はグローバル変数に変換されます。 $_COOKIE[‘xxx’] を通じて読み取ることができます。
現在でも一部のインターネット ユーザーは依然として Cookie について議論していますが、大多数のインターネット ユーザーは依然として Cookie を受け入れる傾向があります。したがって、Web ページの開発には Cookie テクノロジーを安全に使用できます。
3. Cookie 共通関数
● SetCookie この関数は Cookie を作成し、HTTP ヘッダーの末尾に追加します。注意すべき点の 1 つは、Cookie は HTTP プロトコル ヘッダーの一部であり、ブラウザとサーバーの間で情報を転送するために使用されるため、HTML に属するコンテンツの前に呼び出す必要があるということです。 ファイル自体が出力される SetCookie 関数は、この関数を呼び出す前にスペースや空行があっても動作しません。 setCookie() が 2 番目の要素を認識する場合、どの要素も最初の要素を認識しません。 setcookie() 関数を使用するための前提条件は、クライアントのブラウザが cookie をサポートしていることです。クライアントがそれを無効にすると、setcookie() は役に立ちません。
int SetCookie(文字列名, 文字列値, int期限切れ, 文字列パス, 文字列ドメイン, int secure, bool httponly);
パラメータの説明:
name; Cookie変数の名前を設定します。
value;Cookie の値を設定します。
期限切れ;Cookie の有効期限を設定します。ブラウザのプロセスとして Cookie を保存する場合、ブラウザを閉じると無効になります。その後、有効期限を直接 0 に設定できます。例:setcookie("名前","値",0)。このパラメータが設定されていない場合、ブラウザを閉じると Cookie が終了する可能性があります。
パス: Web サーバー上のディレクトリを表します。デフォルトでは、呼び出されたページが配置されているディレクトリになります。ここでもう 1 つ注意すべき点があります。たとえば、サイトにはいくつかの異なるディレクトリ (ショッピング ディレクトリ、 ForumDirectory) の場合、パスなしで Cookie のみを使用する場合、あるディレクトリ内のページに設定された Cookie は、別のディレクトリ内のページには表示されません。指向性のある。実際、パスが指定されていない場合でも、WEB サーバーは現在のパスを自動的にブラウザーに渡し、パスを指定すると、サーバーは設定されたパスを使用するように強制されます。この問題を解決するには、SetCookie を呼び出すときにパスとドメイン名を追加します (ドメイン名の形式は「http://www.phpuser.com/」または「.phpuser.com」です)。 SetCookie関数のvalueを表す部分は渡すときに自動的にエンコードされます、つまりvalueの値が「test value」の場合は渡したときに「test」になります.value」というURLと同じ方法です。もちろん、PHP は Cookie 値を受信すると自動的にデコードするため、これはプログラムに対して透過的です。
ドメイン: Cookie が使用できるドメイン名。デフォルトは呼び出されたページのドメイン名です。ドメイン名には 2 つの「.」が含まれている必要があるため、トップレベル ドメイン名を指定する場合は「.mydomain.com」を使用する必要があります。ドメイン名を設定した後、Cookie を有効にするためには、そのドメイン名を使用して Web サイトにアクセスする必要があります。複数のドメイン名を使用してこのページにアクセスする場合、このフィールドを空にすることも、この Cookie にアクセスするドメイン名がすべて同じドメインに属することもできます。
secure: 「1」に設定すると、ユーザーのブラウザが安全であるとみなしたサーバーのみが Cookie を記憶できることを意味します。
名前を除くすべてのパラメータはオプションです。 3 つのパラメータ値、パス、およびドメインは、設定がないことを示す空の文字列「」に置き換えることができます。expire パラメータと secure パラメータは数値であり、0 で表すことができます。期限切れパラメータは標準の Unix タイムスタンプで、time() または mktime() 関数を使用して秒単位で取得できます。 secure パラメータは、この Cookie が暗号化された HTTPS プロトコルを介してネットワーク上で送信されるかどうかを示します。
httponly: 1 に設定すると、Cookie は http プロトコルでのみ使用できることを意味します。javascript などのスクリプト言語は、PHP によって作成された Cookie を取得できないため、XSS からの攻撃が効果的に弱められます。 (注: これは PHP5 でのみ利用可能なオプションであり、私は使用したことがありません。公式マニュアルを読み、 を翻訳してみました。ご質問がある場合は、こちらを参照してください) (公式マニュアル参照)
現在設定されている Cookie はすぐには有効になりませんが、次のページまたは更新後にのみ表示されます。これは、Cookie が設定されたページのサーバーによってクライアントのブラウザに渡されるためです。次のページまたは更新後に表示されます。サーバーがクライアントのマシンから Cookie を取り出してサーバーに送り返すことができる理由。
グレープバイン
16 歳のドイツ人学生が Cookie を介して Hotmail をクラック
16 歳のドイツ人学生、アドリアン グラースは、ネットワーク セキュリティと Web 開発に非常に興味があり、Hotmail をクラックする方法も発見しました。 1 週間以上経った現在、Microsoft はまだこの脆弱性を修正していません。
この小さなハッカーのアイデアは非常にシンプルで、ユーザーが Hotmail にログインすると、システムは次回のログインを容易にするために Cookie を生成します。 Cookie は IP にバインドされていないため、ハッカーは被害者のパスワードや電子メール アドレスさえ知らなくても、これらの Cookie を偽造してログインに使用できます。 XSS を通じて、ハッカーは JavaScript コードを挿入し、ログ スクリプトを使用して Web サーバーに Cookie を送信することができます。スクリプトは、PHP、ASP、CGI などの言語で記述できます。
Cookie 適用例:
●Cookie の作成:
SetCookie()
●Cookie 配列の作成:
One:
SetCookie(" CookieArray[]", "値 1");
SetCookie("CookieArray[]", "値 2");
2 番目:
SetCookie("CookieArray[0]", "値 1" ) ;
SetCookie("CookieArray[1]", "Value 2");
● Cookie の受信と処理
PHP は Cookie の受信と処理を非常に適切にサポートしており、完全に自動です。 GET 変数や POST 変数と同じ原理で、非常に簡単です。
たとえば、MyCookier という名前の Cookie を設定すると、PHP は WEB サーバーが受信した HTTP ヘッダーからそれを自動的に分析し、$_COOKIE['MyCookie'] という名前の直接使用できるグローバル変数を形成します。値はCookieの値です。配列にも同じことが当てはまります。
例は次のとおりです: (これらが前のページで設定されており、まだ有効であると仮定します)
echo $_COOKIE['MyCookie'];
Cookie 配列を取り出す例:
とても簡単です。
●Cookieの削除
既存のCookieを削除するには、2つの方法があります:
1. nameパラメータのみを指定してSetCookieを呼び出します。その後、この名前のCookieが関連するCookieから削除されます。 Computer;
setcookie("MyCookie"); //MyCookie を削除します。
2. Cookie の有効期限を time() または time()-1 に設定します//有効期限内である限り、time() をどれだけ短縮しても問題ありません//、この Cookie はこのページを閲覧後、有効期限が切れました。削除されました(実際には無効になっています)。例:
setcookie("MyCookie","Value",time()-1); //MyCookie を削除します。
Cookie が削除されても、その値は現在のページで引き続き有効であることに注意してください。
Cookie をブラウザのプロセスとして保存する場合、ブラウザを閉じると無効になります。その後、有効期限を直接 0 に設定できます。例: setcookie("名前","値",0)。このパラメータが設定されていない場合、ブラウザを閉じると Cookie が終了する可能性があります。
Cookie Notes
1. SetCookie() の前に HTML 出力を置くことはできません。2 番目の出力が認識されます。スペースや空行も含め、最初の出力を認識する要素はありません。 。 いいえ。
2. SetCookie() の後、現在のページで echo $_COOKIE["name"] を呼び出しても出力はありません。 Cookie の値を確認するには、更新するか次のページに移動する必要があります。理由は簡単です。 SetCookie() が実行されると、Cookie がクライアントに送信されます。ユーザーが次のページを更新したり閲覧したりしない場合、クライアントはどのようにして Cookie を送信できるのでしょうか?ブラウザが Cookie を作成すると、Web サイトへのすべてのリクエストのヘッダーに Cookie が含まれますが、他の Web サイトからのリクエストに Cookie が送信されることはありません。そしてブラウザは Cookie の有効期限が切れるまで送信し続けます。
3. Cookie の使用に関する制限。ブラウザで作成できるCookieの最大数は30個、1個あたり4KBを超えてはならず、各WEBサイトで設定できるCookieの総数は20個を超えてはなりません。 (これは私が本で読んだことです。Web サイトでは 30 個を超える Cookie を作成できないはずです。そうでないと、私のマシンには何百もの Cookie が存在します。アドバイスをお願いします。)
4 、Cookie は保存されます。ユーザーが Cookie を無効にすると、当然ながら Cookie は無効になります。今日のブラウザは、クライアントに Cookie を送信するたびに、ウォッチドッグのようにそれを傍受し、Cookie の入力を許可するかどうかをユーザーに尋ねます。神様、ユーザーは専門家ではありません。Cookie が何であるかを知っている人は何人いるでしょうか?もしかしたらウイルス扱いされてシャットアウトされるかも知れません。 ###############セッション###############
1. セッションとは何ですか?
セッションの中国語訳は「会話」といいますが、本来の意味は始まりと終わりのある一連の行為・メッセージのことを指します。電話を取る~ダイヤルする~電話を切るまでが通話できるセッションです。現在の社会におけるセッションの理解は非常に混乱しています。「ブラウザ セッション中、...」という言葉が時々見られますが、ここでのセッションとはブラウザ ウィンドウが開いてから閉じるまでの期間を指します。また、「いつ」ということもできます。 「セッション中のユーザー(クライアント)」という文では、ユーザーの一連の行動(通常はログインから商品の購入、チェックアウトまでなど、特定の目的に関連した一連の行動)を指す場合があります。このようなオンライン ショッピング プロセスは、接続のみを指す場合もあります。違いは文脈から推測することしかできません。
ただし、セッションという単語が ネットワーク # とともに使用される場合は、 ##プロトコルが関連付けられている場合、多くの場合、「接続指向」および/または「状態の維持」という 2 つの意味が含まれます。「接続指向」とは、通信する前に通信当事者が通信チャネルを確立する必要があることを意味します。電話をかけると、相手が電話に出るまで通信を開始できません。「状態を保持する」とは、通信する側が一連のメッセージを関連付けて、メッセージが相互に依存できるようにすることを意味します。たとえば、ウェイターはメッセージを認識できます。 「また来る古い友人です。また、顧客は、前回その店に 1 ドルを借りていたことも覚えています。このカテゴリの例としては、「TCP セッション」または「POP3 セッション」があります。 この混乱が生じているという事実を考慮すると、不可逆的なため、セッションを定義する必要があります。統一した標準を持つことは困難です。セッション関連の情報を読むとき、理解を推測するにはコンテキストに依存するしかありません。しかし、次のように理解できます。たとえば、電話は、電話をかけた瞬間から電話を切るまで、電話は接続されたままであるため、
したがって、この接続状態はセッションと呼ばれます。これは、相互間の対話中に常に存在するパブリック変数です。訪問者と Web サイト全体。クライアントが COOKIE をサポートしていない場合、データが正しく安全であることを保証するために、SESSION 変数が使用されます。Web サイトの訪問者には、一意の識別子、いわゆるセッション ID が割り当てられます。クライアントの Cookie に保存されるか、URL を介して渡されます。 SESSION の発明 HTTP プロトコルの制限を埋める: HTTP プロトコルはステートレス プロトコルとみなされ、ユーザーの閲覧ステータスを知ることができません。サーバー側で応答が返されると、サーバーはブラウザとの接続を失います。これは HTTP プロトコルの本来の性質と一致しています。目的は一貫しています。クライアントはサーバーに特定のファイルのダウンロードを要求するだけで済みます。クライアントもブラウザーも必要ありません。サーバーはお互いの過去の行動を記録する必要がある それぞれのリクエストは顧客と自動サーバーのように独立している 自動販売機と通常の (非会員制) ハイパーマーケットの関係は同じである
したがって、関連情報ユーザーの情報はセッションを通じて記録されます (Cookie は別の解決策です)。ユーザーはこの機能で Web サーバーに再度ログインできます。リクエストが行われたときに確認します。セッションの発明により、ユーザーは切り替え時に自分の情報を保存できます。複数のページの間。 Webサイトのプログラマーなら誰しも経験があることですが、各ページの変数は次のページでは使えない(formやURLも実装できるが非常に不満足な方法)一方、SESSIONに登録した変数はグローバルとして使える変数。
それで、SESSION は何に役立つのでしょうか?インターネットで買い物をする際、誰でもショッピングカートを利用したことがあると思いますが、いつでも好きな商品をショッピングカートに入れて、最後はレジに行って会計をすることができます。プロセス全体を通じて、ショッピング カートは選択した商品を一時的に保管する役割を果たしています。Web サイト上でのユーザーの
アクティビティ を追跡するために使用されます。これが SESSION の役割です。ユーザーID認証、プログラムステータス記録、ページ間のパラメータ転送などに使用できます。 SESSION の実装には COOKIE テクノロジーが使用されており、SESSION は session_id (SESSION 番号) を含む COOKIE をクライアント側に保存し、session_name などの他のセッション変数はサーバー側に保存されます。ユーザーがサーバーにリクエストを行うと、session_idもサーバーに送信されるので、session_idを介してサーバー側に保存されている変数を抽出することで、ユーザーが誰であるかを特定できます。同時に、SESSION が時々失敗する理由を理解するのは難しくありません。
当客户端禁用COOKIE时(点击IE中的“工具”—“Internet选项”,在弹出的对话框里点击“安全”—“自定义级别”项,将“允许每个对话COOKIE”设为禁用),session_id将无法传递,此时SESSION失效。不过php5在linux/unix平台可以自动检查cookie状态,如果客户端设置了禁用,则系统自动把session_id附加到url上传递。windows主机则无此功能。
2、Session常见函数及用法?
●Session_start():开始一个会话或者返回已经存在的会话。
说明:这个函数没有参数,且返回值均为true。如果你使用基于cookie的session(cookie-based sessions),那么在使用Session_start()之前浏览器不能有任何输出,否则会发生以下错误:
Warning: Cannot send session cache limiter - headers already sent (output started at /usr/local/apache/htdocs/cga/member/1.php:2)…………
你可以在php.ini里启动session.auto_start=1,这样就无需每次使用session之前都要调用session_start()。但启用该选项也有一些限制,如果确实启用了 session.auto_start,则不能将对象放入会话中,因为类定义必须在启动会话之前加载以在会话中重建对象。
请求结束后所有注册的变量都会被序列化。已注册但未定义的变量被标记为未定义。在之后的访问中这些变量也未被会话模块定义,除非用户以后定义它们。
警告: 有些类型的数据不能被序列化因此也就不能保存在会话中。包括 resource 变量或者有循环引用的对象(即某对象将一个指向自己的引用传递给另一个对象)。
●注册SESSION变量 :
PHP5使用$_SESSION[‘xxx’]=xxx注册SESSION全局变量。和GET,POST,COOKIE的使用方法相似。
注意:session_register(),session_unregister ,session_is_registered在php5下不再使用,除非在php.ini里把register_globle设为on,不过出于安全考虑,强烈建议关闭register_globle。HTTP_SESSION_VARS也不提倡使用了,官方建议用$_SESSION代替之。例如:
Page1.php
Session_start(); //使用SESSION前必须调用该函数。 $_SESSION[‘name’]=”我是黑旋风李逵!”; //注册一个SESSION变量 $_SESSION[‘passwd’]=”mynameislikui”; $_SESSION[‘time’]=time(); echo '<br /><a href="page2.php">通过COOKIE传递SESSION</a>'; //如果客户端支持cookie,可通过该链接传递session到下一页。 echo '<br /><a href="page2.php?' . SID . '">通过URL传递SESSION</a>';//客户端不支持cookie时,使用该办法传递session. ?> Page2.php <?php session_start(); echo $_SESSION['name']; // echo $_SESSION['passwd']; // echo date('Y m d H:i:s', $_SESSION['time']); echo '<br /><a href="page1.php">返回山一页</a>';
有两种方法传递一个会话 ID:
cookie
URL 参数
会话模块支持这两种方法。cookie 更优化,但由于不总是可用,也提供替代的方法。第二种方法直接将会话 ID 嵌入到 URL 中间去。
PHP 可以透明地转换连接。除非是使用 PHP 4.2 或更新版本,需要手工在编译 PHP 时激活。在 Unix 下,用 --enable-trans-sid 配置选项。如果此配置选项和运行时选项 session.use_trans_sid 都被激活(修改php.ini),相对 URI 将被自动修改为包含会话 ID。
●session_id
session_id() 用于设定或取得当前session_id。php5中既可以使用session_id(),也可以通过附加在url上的SID取得当前会话的session_id和session_name。
如果session_id()有具体指定值的话,将取代当前的session_id值。使用该函数前必须启动会话:session_start();
当我们使用session cookies时,如果指定了一个session_id()值,每次启动session_start()都会往客户端发送一个cookie值。不论当前session_id是否与指定值相等。
session_id()如果没有指定值,则返回当前session_id();当前会话没有启动的话,则返回空字符串。
●检查session是否存在?
在以往的php版本中通常使用session_is_register()检查session是否存在,如果您使用$_SESSION[‘XXX’]=XXX来注册会话变量,则session_is_register()函数不再起作用。你可以使用
isset($_SESSION[‘xxx’])来替代。
● 更改session_id session_regenerate_id() 更改成功则返回true,失败则返回false。
使用该函数可以为当前session更改session_id,但不改变当前session的其他信息。例如:
<?php session_start(); $old_sessionid = session_id(); session_regenerate_id(); $new_sessionid = session_id(); echo "原始 SessionID: $old_sessionid<br />"; echo "新的 SessionID: $new_sessionid<br />"; echo"<pre class="brush:php;toolbar:false">"; print_r($_SESSION); echo""; ?>
●session_name()返回当前session的name或改变当前session的name。如果要改变当前session的name,必须在session_start()之前调用该函数。注意:session_name不能只由数字组成,它至少包含一个字母。否则会在每时每刻都生成一个新的session id.
session改名示例:
<?php $previous_name = session_name("WebsiteID"); echo "新的session名为: $previous_name<br />"; ?>
●如何删除session?
1、unset ($_SESSION['xxx'])删除单个session,unset($_SESSION['xxx']) 用来unregister一个已注册的session变量。其作用和session_unregister()相同。 session_unregister()在PHP5中不再使用,可将之打入冷宫。
unset($_SESSION) 此函数千万不可使用,它会将全局变量$_SESSION销毁,而且还没有可行的办法将其恢复。用户也不再可以注册$_SESSION变量。
2、$_SESSION=array()删除多个session
3、session_destroy()结束当前的会话,并清空会话中的所有资源。。该函数不会unset(释放)和当前session相关的全局变量(globalvariables),也不会删除客户端的session cookie.PHP默认的session是基于cookie的,如果要删除cookie的话,必须借助setcookie()函数。
返回值:布尔值。
功能说明:这个函数结束当前的session,此函数没有参数,且返回值均为true
session_unset() 如果使用了$_SESSION,则该函数不再起作用。由于PHP5必定要使用$_SESSION,所以此函数可以打入冷宫了。
下面是PHP官方关于删除session的案例:
<?php // 初始化session. session_start(); /*** 删除所有的session变量..也可用unset($_SESSION[xxx])逐个删除。****/ $_SESSION = array(); /***删除sessin id.由于session默认是基于cookie的,所以使用setcookie删除包含session id的cookie.***/ if (isset($_COOKIE[session_name()])) { setcookie(session_name(), '', time()-42000, '/'); } // 最后彻底销毁session. session_destroy(); ?>
由此我们可以得出删除Session的步骤:
①session_start()
②$_SESSION=array()/unset($_SESSION['xxx'])
③session_destroy()
# SESSION セキュリティ:
セッション モジュールは、セッションに保存された情報がセッションを作成したユーザーのみに表示されることを保証できません。保存されているデータによっては、セッションの整合性を積極的に保護するために、さらに多くの手順を実行する必要があります。
セッションで伝送されるデータを評価し、追加の保護措置を実装すると、多くの場合コストがかかり、ユーザーの利便性が低下します。たとえば、単純なソーシャル ポリシーからユーザーを保護したい場合 (注: URL に表示されるセッション ID は、コンピューター画面上の他のユーザーに表示されたり、HTTP リファラーなどを通じて他の Web サイトによって取得されたりします)、これを有効にする必要があります。 . session.use_only_cookies。この場合、クライアントは Cookie を無条件に有効にする必要があります。そうしないと、セッションは機能しません。
既存のセッション ID を第三者に漏らす方法はいくつかあります。セッション ID が漏洩すると、第三者が指定された ID に関連付けられたすべてのリソースにアクセスできるようになります。まず、URL にはセッション ID が含まれています。外部サイトに接続すると、セッション ID を含む URL が外部サイトのリファラー ログに保存される場合があります。第 2 に、より積極的な攻撃者がネットワーク セグメント上のパケットを傍受する可能性があります。暗号化されていない場合、セッション ID はクリア テキストでネットワーク上を流れます。この問題を解決するには、サーバーに SSL を実装し、ユーザーに SSL の使用を強制します。
デフォルトでは、特定のセッションに関連するすべてのデータは、INI オプション session.save_path で指定されたディレクトリ内のファイルに保存されます。 (そのセッションに関連付けられたデータがあるかどうかに関係なく) セッションごとに 1 つのファイルが作成されます。これは、データがファイルに書き込まれるかどうかに関係なく、セッションが開かれるたびにファイルが作成されるためです。ファイル システムの操作に制限があるため、この動作には副作用があり、ユーザーがカスタマイズしたセッション ハンドラー (database の使用など) が、次のようなセッションを失う可能性があることに注意してください。データを保存しません。
上記で紹介した関数を以下で使用しますが、セッションに関連する関数もいくつか紹介します。
session_encode
関数関数: セッション情報のエンコード
関数プロトタイプ: string session_encode(void) ;
戻り値: 文字列
関数の説明: 返される文字列には、グローバル変数の各変数の名前と値が次の形式で含まれます: a|s:12:"it is a test";c|s:4:"lala"; a は変数名です s:12 は変数 a の値を表します "それは a です テストの長さは 12 で、変数はセミコロンで区切られます";".
session_decode
関数: セッション情報をデコード
関数プロトタイプ: boolean session_decode (文字列データ)
戻り値: ブール値
関数の説明: この関数はセッション情報をデコードでき、成功した場合は論理値を返します true
Php5 は session_id を使用しなくなりましたが、それを定数 SID に変換して cookie に保存します。クライアントが cookie を無効にすると、php は自動的に URL を通じて SID を自動的に渡します。 php.ini session.use_trans_sid = 1 を設定することです。この時点では、クライアントが Cookie を無効にしても問題ありません。
XSS 関連の攻撃を避けるために、strip_tags() を使用して SID を出力します。
Session跨页传递问题:
session跨页传递需要考虑三种情况:
①客户端禁用了cookie。
②浏览器出现问题,暂时无法存取cookie
③php.ini中的session.use_trans_sid = 0或者编译时没有打开--enable-trans-sid选项
为什么会这样呢?下面解释一下原因:
Session文件分为两部分:session变量保存在服务器端(默认以文件方式存储session);而session id则以cookie形式保存在客户端。(注意:session默认是基于cookie的)。
当用户的浏览器向服务器提出请求时,同时发送包含session id的cookie(默认情况下)。服务器根据客户端提供的session id来得到用户的文件,即保存在服务器端的session变量值。事实上,session id可以使用客户端的Cookie或者Http1.1协议的Query_String(就是访问的URL的“?”后面的部分)来传送给服务器,然后服务器读取Session的目录……。也就是说,session id是取得存储在服务上的session变量的身份证。当代码session_start();运行的时候,就在服务器上产生了一个session文件,随之也产生了与之唯一对应的一个session id,定义session变量以一定形式存储在刚才产生的session文件中。通过session id,可以取出定义的变量。跨页后,为了使用session,你必须又执行session_start();将又会产生一个session文件,与之对应产生相应的session id,用这个session id是取不出前面提到的第一个session文件中的变量的,因为这个session id不是打开它的“钥匙”。如果在session_start();之前加代码session_id($session id);将不产生新的session文件,直接读取与这个id对应的session文件。
PHP中的session在默认情况下是使用客户端的Cookie来保存session id的,所以当客户端的cookie出现问题的时候就会影响session了。必须注意的是:session不一定必须依赖cookie,这也是 session相比cookie的高明之处。当客户端的Cookie被禁用或出现问题时,PHP会自动把session id附着在URL中,这样再通过session id就能跨页使用session变量了。但这种附着也是有一定条件的,其一:“php.ini中的session.use_trans_sid = 1或者编译时打开打开了--enable-trans-sid选项”;其二:运行PHP的服务器必须是unix/linux系统,windows不具备此项功能。
明白了以上的道理,我们就可以得出解决session跨页传递问题的三条途径:
1、设置php.ini中的session.use_trans_sid = 1或者编译时打开打开了--enable-trans-sid选项,让PHP自动跨页传递session id。
2、手动通过URL传值、隐藏表单传递session id。
3、用文件、数据库等形式保存session_id,在跨页过程中手动调用。
下面举例说明:
第一种情况:
page1.php
<?php session_start(); $_SESSION['var1']="中华人民共和国"; $url="<a href="."\"s2.php\">下一页</a>"; echo $url; ?> page2.php <?php session_start(); echo "传递的session变量var1的值为:".$_SESSION['var1']; ?>
运行以上代码,在客户端cookie正常的情况下,应该可以在得到结果“中华人民共和国”。
现在你手动关闭客户端的cookie,再运行,可能得不到结果了吧。如果得不到结果,再“设置php.ini中的session.use_trans_sid = 1或者编译时打开打开了--enable-trans-sid选项”,又得到结果“中华人民共和国”
第二种途径:
s1.php
<?php session_start(); $_SESSION['var1']="中华人民共和国"; $sn = session_id(); $url="<a href="."\"s2.php?s=".$sn."\">下一页</a>"; //PHP5定义了一个常量SID来表示session_id(),$url还可以写成$url='<a href="page2.php?' . SID . '">下一页</a>'; echo $url; ?> s2.php <?php session_id($_GET['s']); session_start(); echo "传递的session变量var1的值为:".$_SESSION['var1']; ?>
第三种途径:
login.html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Login</title> <meta http-equiv="Content-Type" content="text/html; charset=??????"> </head> <body> 请登录: <form name="login" method="post" action="mylogin1.php"> 用户名:<input type="text" name="name"><br> 口 令:<input type="password" name="pass"><br> <input type="submit" value="登录"> </form> </body> </html> mylogin1.php <?php $name=$_POST['name']; $pass=$_POST['pass']; if(!$name || !$pass) { echo "用户名或密码为空,请<a href=\"login.html\">重新登录</a>"; die(); } if (!($name=="laogong" && $pass=="123")) { echo "用户名或密码不正确,请<a href=\"login.html\">重新登录</a>"; die(); } //注册用户 ob_start(); session_start(); $_SESSION['user']= $name; $psid=session_id(); $fp=fopen("e:\\tmp\\phpsid.txt","w+"); fwrite($fp,$psid); fclose($fp); //身份验证成功,进行相关操作 echo "已登录<br>"; echo "<a href=\"mylogin2.php\">下一页</a>"; ?> mylogin2.php <?php $fp=fopen("e:\\tmp\\phpsid.txt","r"); $sid=fread($fp,1024); fclose($fp); session_id($sid); session_start(); if(isset($_SESSION['user']) && $_SESSION['user']="laogong" ) { echo "已登录!"; } else { //成功登录进行相关操作 echo "未登录,无权访问";
推荐学习:《PHP视频教程》
以上がPHP5 のメモ (COOKIE と SESSION) を解決するための 1 つのトリック (共有)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。