動的 Web ページ テクノロジー Cookie とセッションの PHP 分析
著者:Eve Cole
更新時間:2009-06-06 18:16:01
1.PHP クッキー
Cookie は、ユーザーを追跡および識別するためにリモート ブラウザーにデータを保存するメカニズムです。
PHP は http プロトコルのヘッダー情報で Cookie を送信するため、他の情報がブラウザーに出力される前に setcookie() 関数を呼び出す必要があります。これは header() 関数の制限と同様です。
1.1 Cookie を設定します。
Cookie は、setcookie() 関数または setrawcookie() 関数を使用して設定できます。 http ヘッダーをクライアントに直接送信して設定することもできます。
1.1.1 setcookie() 関数を使用して Cookie を設定します。
bool setcookie ( 文字列名 [, 文字列値 [, intexpire [, 文字列パス [, 文字列ドメイン [, bool secure [, bool httponly]]]]]] )
name: クッキー変数名
value: Cookie 変数の値
期限切れ: 有効期間が終了する時刻、
パス: 有効なディレクトリ、
ドメイン: 有効なドメイン名、一意のトップレベル ドメイン
secure: 値が 1 の場合、Cookie は https 接続でのみ有効です。デフォルト値が 0 の場合、http と https の両方が有効です。
例:
<?php
$value = 'どこかから来たもの';
setcookie("TestCookie", $value); /* 簡単な Cookie 設定*/
setcookie("TestCookie", $value, time()+3600); /* 有効期間は 1 時間です*/
setcookie("TestCookie", $value, time()+3600, "/~rasmus/", ".example.com", 1); /* 有効なディレクトリ/~rasmus、有効なドメイン名 example.com とそのすべてのサブドメイン*/
?>
複数の Cookie 変数を設定します: setcookie('var[a]','value'); 変数を表すために配列を使用しますが、その添字には引用符は必要ありません。この方法では $_COOKIE['var'][ を使用できます。 'a'] COOKIE 変数を読み取ります。
1.1.2. header() を使用して Cookie を設定します。
header("Set-Cookie: name=$value[;path=$path[;domain=xxx.com[;...]]");
次のパラメータは、上記の setcookie 関数のパラメータと同じです。
例えば:
$value = 'どこかから来たもの';
header("Set-Cookie:name=$value");
1.2 Cookie の読み取り:
PHP の組み込みスーパー グローバル変数 $_COOKIE を直接使用して、ブラウザ側で Cookie を読み取ることができます。
上の例では、Cookie「TestCookie」が設定されています。次に、それを読んでみましょう。
print $_COOKIE['TestCookie'];
COOKIE はエクスポートされましたか?!
1.3 Cookieの削除
有効時間を現在時間よりも小さく設定し、値を空に設定するだけです。次に例を示します。
setcookie("名前","",time()-1);
header() を使用するのと似ています。
1.4 一般的な問題の解決:
1) setcookie() を使用するとエラー メッセージが表示されます。これは、setcookie() を呼び出す前に出力またはスペースがあることが原因である可能性があります。また、ドキュメントが他の文字セットから変換されており、ドキュメントに BOM 署名がある可能性もあります。この問題を解決するには、ob_start() 関数を使用して、この状況が発生するのを防ぐこともできます。
2) $_COOKIE は magic_quotes_gpc の影響を受け、自動的にエスケープされる可能性があります
3) 使用する場合、ユーザーがCookieをサポートしているかどうかをテストする必要があります
<!--[if !supportLineBreakNewLine]-->
1.5 Cookie の動作メカニズム:
学習者の中には衝動的で原則を勉強する時間がない人もいるので、それを後回しにしました。
a) サーバーは、応答とともに http Set-Cookie ヘッダーを送信することにより、クライアントに Cookie を設定します (複数の Cookie には複数のヘッダーが必要です)。
b) クライアントは自動的に http Cookie ヘッダーをサーバーに送信し、サーバーはそれを受信して読み取ります。
HTTP/1.x 200 OK
X-Powered-By: PHP/5.2.1
Set-Cookie: TestCookie=どこかからのパス=/
有効期限: 2007 年 11 月 19 日木曜日 18:52:00 GMT
キャッシュ制御: no-store、no-cache、must-revalidate、post-check=0、pre-check=0
プラグマ: キャッシュなし
コンテンツタイプ: テキスト/html
この行を受け取った後、この行は cookie 関数を実装します。
Set-Cookie: TestCookie=どこかからのパス=/
ブラウザはクライアントのディスク上に Cookie ファイルを作成し、次のように書き込みます。
TestCookie=どこかから来たもの。
/
この行は、setcookie('TestCookie','something from somewhere','/'); を使用した結果であり、header('Set-Cookie: TestCookie=something from somewhere; path=/') を使用した結果でもあります。 ;。
<!--[endif]-->
2.PHPセッション
セッションは、有効期限が 0 に設定された Cookie を使用し、セッション ID (長い文字列) と呼ばれる一意の識別子を使用してサーバー側の一部のセッション ファイルを同期し (セッション ストレージ タイプは自分で定義できます)、次の通信と通信します。ユーザーが接続されています。Web アプリケーションはこれらのセッションに関連付けられたデータを保存し、ユーザーのページ間でデータをやり取りできるようにします。
Web サイトの訪問者には、一意の識別子、いわゆるセッション ID が割り当てられます。これは、クライアント側の Cookie に保存されるか、URL 経由で渡されます。
セッションのサポートにより、ユーザーは任意の数の変数を登録し、リクエストごとに変数を予約できます。訪問者が Web サイトにアクセスすると、PHP は特定のセッション ID がリクエストで送信されたかどうかを自動的に (session.auto_start が 1 に設定されている場合)、またはユーザーがリクエストしたときに (session_start() によって明示的に呼び出されるか、または session_register() によって暗黙的にチェックされます。 ))。その場合、以前に保存された環境が再作成されます。
2.1 セッションIDの送信
2.1.1 Cookieによるsessin IDの送信
session_start() を使用してセッション ファイルを生成すると、サーバーはセッション ID ハッシュ値とセッション名をデフォルト値の PHPSESSID で生成し、変数をクライアントに送信します (デフォルトは PHPSESSID (セッション名))。 )、値は 128 ビットのハッシュ値です。サーバーはこの Cookie を通じてクライアントと通信します。
セッション変数の値は、PHP によって内部的にシリアル化され、サーバー マシン上のテキスト ファイルに保存され、デフォルトで変数名が PHPSESSID であるクライアントの Coolie と対話します。
つまり、サーバーは http ヘッダーを自動的に送信します。 header('Set-Cookie: session_name()=session_id(); path=/');
つまり、setcookie(session_name(),session_id());
このページから新しいページにジャンプして session_start() を呼び出すと、PHP は指定された ID に関連付けられたサーバー側に保存されたセッション データを確認し、見つからない場合は、新しいデータ セットが作成されます。
2.1.2 URLによるセッションIDの送信
このメソッドは、ユーザーが Cookie の使用を禁止している場合にのみ使用されます。ブラウザの Cookie はすでにユニバーサルであり、セキュリティ上の理由から、このメソッドは必要ありません。
<a href="p.php?<?php print session_name() ?>=<?php print session_id() ?>">xxx</a> の場合、セッション値は POST 経由で渡すこともできます。
2.2 セッションの基本的な使用例
<?php
// page1.php
セッション開始();
echo 'ページ #1 へようこそ';
/* セッション変数を作成し、セッション変数に値を代入します */
$_SESSION['お気に入りの色'] = '緑';
$_SESSION['動物'] = '猫';
$_SESSION['時間'] = 時間();
// クライアントが Cookie を使用する場合、セッションを直接 page2.php に渡すことができます。
echo '<br /><a href="page2.php">ページ 2</a>';
// クライアントが Cookie を無効にしている場合
echo '<br /><a href="page2.php?' . SID . '">ページ 2</a>';
/*
デフォルトでは、php5.2.1 では、セッションの場合、Cookie が書き込まれるときにのみ SID が値を持ちます。
対応する Cookie がすでに存在する場合、SID は (未定義) 空になります。
*/
?>
<?php
// page2.php
セッション開始();
print $_SESSION['animal']; // 単一のセッションを出力します。
var_dump($_SESSION); // page1.php によって渡されたセッション値を出力します。
?>
2.3 セッション機能を使用してページのキャッシュを制御します。
多くの場合、Web ページがクライアントにキャッシュされているかどうかを判断したり、キャッシュの有効期間を設定したりする必要があります。たとえば、Web ページに機密コンテンツがあり、それがローカルにキャッシュされている場合は、それを表示するためにログインする必要があります。 、ローカル キャッシュを直接開くことができ、ログインせずに Web を閲覧できます。
session_cache_limiter('private'); を使用してページ クライアント キャッシュを制御します。これは session_start() の前に呼び出す必要があります。
その他のパラメータについては、 http://blog.chinaunix.net/u/27731/showart.php?id=258087のクライアント キャッシュ制御を参照してください。
クライアントのキャッシュ時間を制御するには、session_cache_expire(s) ユニットを使用します。これも session_start() の前に呼び出す必要があります。
これは、セッションを使用するときにキャッシュを制御するための唯一の方法です。header() でページのキャッシュを制御することもできます。
2.4 セッションの削除
達成するには 3 つのステップが必要です。
<?php
session_destroy(); // 最初のステップ: サーバー側のセッション ファイルを削除します。
setcookie(session_name(),'',time()-3600); // ステップ 2: 実際のセッションを削除します。
$_SESSION = array(); // ステップ 3: $_SESSION グローバル変数配列を削除します。
?>
2.5 PHP の大規模 Web アプリケーションでのセッションの使用 現時点では、デフォルトのセッション保存方法はデータベースを使用してアクセスすることは適切ではありません。 function bool session_set_save_handler (callback open、callback close、callback read、callback write、callback destroy、callback gc) は、この問題を解決するために提供されるソリューションです。
この関数で使用する関数は次の 6 つです。
1. bool open() はセッションストレージメカニズムを開くために使用されます。
2. bool close() はセッションストレージ操作を閉じます。
3. mixde read() セッションデータをストレージからロードするときにこの関数を使用します
4. bool write() は、指定されたセッション ID のすべてのデータをストレージに書き込みます
5. bool destroy() は、指定されたセッション ID に関連付けられたデータを破棄します。
6. bool gc() ストレージ システム内のデータのガベージ コレクションの例については、PHP マニュアルの session_set_save_handler() 関数を参照してください。
クラスを使用して処理する場合は、次を使用します。
session_set_save_handler(
array('className','open'),
array('className','close'),
array('className','read'),
array('className','write'),
array('className','destroy'),
array('className','gc'),
)
className クラス内の 6 つの静的メソッドを呼び出します。 ClassName はオブジェクトに変更できるため、静的メソッドを呼び出す必要はありません。ただし、静的メンバーを使用すると、オブジェクトを生成する必要がなく、パフォーマンスが向上します。
2.6 一般的に使用されるセッション関数:
bool session_start(void); セッションを初期化します。
bool session_destroy(void): サーバー側のセッション関連ファイルを削除します。
string session_id() 現在のセッションの ID
string session_name() 現在アクセスされているセッション名。クライアントがセッション ID を保存する Cookie 名です。デフォルトは PHPSESSID です。
array session_get_cookie_params() このセッションに関連付けられたセッションの詳細。
string session_cache_limiter() は、セッションを使用してページのクライアント キャッシュを制御します
ini session_cache_expire() はクライアントのキャッシュ時間を制御します
bool session_destroy() はサーバー側のセッション情報を保存するファイルを削除します
void session_set_cookie_params ( int lifetime [, string path [, string domain [, bool secure [, bool httponly]]]] ) このセッションに関連付けられたセッションの詳細を設定します
bool session_set_save_handler (callback open、callback close、callback read、callback write、callback destroy、callback gc) は、セッションを処理するための関数を定義します (デフォルトのメソッドを使用しない)。
bool session_regenerate_id([bool delete_old_session]) 新しいセッション ID を割り当てます
2.7 セッションのセキュリティの問題 攻撃者は、既存のユーザーの有効なセッション ID を取得しようと多大な労力を費やし、そのセッション ID を使用して、システム内でこのユーザーと同じ機能を持つことができる可能性があります。
したがって、私たちの主な解決策は、セッション ID の有効性を検証することです。
<?php
if(!isset($_SESSION['user_agent'])){
$_SESSION['user_agent'] = $_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT'];
}
/* ユーザーセッションIDが偽造された場合*/
elseif ($_SESSION['user_agent'] != $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT']) {
session_regenerate_id();