PHP Cookie とセッションの分析
1. PHP の COOKIE
Cookie は、リモートのブラウザ側にデータを保存し、ユーザーの追跡と識別に使用する仕組みです。
PHP は http プロトコルのヘッダー情報で Cookie を送信するため、他の情報がブラウザーに出力される前に setcookie() 関数を呼び出す必要があります。これは header() 関数の制限と同様です。
1.1 Cookie の設定:
setcookie() または setrawcookie() 関数を使用して Cookie を設定できます。 http ヘッダーをクライアントに直接送信することによって設定することもできます。
1.1.1 setcookie() 関数を使用して Cookie を設定します。
bool setcookie (php?name=str" onclick="tagshow(event)") class=" t_tag">文字列名 [, php?name=str" onclick="tagshow(event)" class="t_tag">文字列値 [, int期限切れ [, php?name=str" onclick="tagshow] (イベント) " class="t_tag">文字列パス [, php?name=str" onclick="tagshow(event)" class="t_tag">文字列ドメイン [, bool secure [, bool httponly]]]] ]] )
name: Cookie 変数名
value: Cookie 変数の値
expire: 有効期限、
path: 有効なディレクトリ、
domain: 有効なドメイン名、一意のトップレベル ドメイン
secure : 値が 1 の場合、Cookie は https 接続でのみ有効です。デフォルト値 0 の場合、http と https の両方が利用可能です。
例:
$value = 'どこかから来たもの';
setcookie("TestCookie", $value);
setcookie("TestCookie", $value, time()+3600);
setcookie(" TestCookie", $value, time()+3600, "/~rasmus/", ".example.com", 1);
?>
複数の 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 = 'something from somewhere';
header ("Set-Cookie:name=$value");
1.2 Cookie の読み取り:
PHP の組み込みスーパー グローバル変数 $_COOKIE を直接使用して、ブラウザ側で Cookie を読み取ることができます。 .
上記の例では、Cookie「TestCookie」が設定されています。
print $_COOKIE['TestCookie'];
COOKIE は出力されましたか?!
1.3 Cookie を削除するには
有効期間を変更するだけです 現在の時刻よりも小さい値に設定し、値を空に設定します。 例:
setcookie("name","",time)。 ()-1);
header() の使用も同様です。
1.4 よくある問題の解決:
1) setcookie() を使用するとエラー メッセージが表示されることが考えられます。 setcookie() を呼び出す前に出力またはスペースがある可能性もあります。また、ドキュメントが他の文字セットから変換されており、ドキュメントの後半で BOM 署名に問題が発生する可能性があります (つまり、ファイルに非表示の BOM 文字が追加されます)。この問題を解決するには、ob_start() 関数を使用して対処することもできます。
2) $_COOKIE は、magic_quotes_gpc の影響を受けるため、自動的にエスケープされる可能性があります。
3)使用する場合、ユーザーが Cookie をサポートしているかどうかをテストする必要があります
1.5 Cookie の動作メカニズム:
一部の学習者
a) サーバーは応答とともに http Set-Cookie ヘッダーを送信し、クライアントはマシンに cookie を設定します (複数の cookie には複数の cookie が必要です)
b) クライアントは自動的に http Cookie ヘッダーをサーバーに送信し、サーバーはそれを受信して読み取ります。
HTTP/1.x 200 OK
X-Powered-By: PHP/5.2.1
Set-Cookie: TestCookie=どこかからのもの; path=/
有効期限: 木、2007 年 11 月 19 日 18:52:00 GMT
キャッシュ -Control: no-store、no- cache、must-ridate、post-check=0、pre-check=0
Pragma: no-cache
Content-type: text/html
この行は、受信後の Cookie 関数を実装します。この行
Set-Cookie: TestCookie=something from somewhere; path=/
ブラウザはクライアントのディスク上に Cookie ファイルを作成し、そこに次のように書き込みます:
TestCookie=something from somewhere;
/
この行は setcookie('TestCookie','something from somewhere','/') を使用した結果です。つまり、 header('Set-Cookie: TestCookie=) の結果です。どこかからの何か; path=/');.
2 . PHP の Session
セッションは有効期限が 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 を介したセッション ID の送信
セッションを呼び出すには、セッション 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 セッション ID の送信URL 経由
ブラウザの Cookie はすでにユニバーサルであるため、このメソッドはユーザーが Cookie の使用を禁止している場合にのみ使用されます。
xxx、POST を通じてセッション値を渡すこともできます。
2.2 基本的な使用法セッションの例
// page1.php
session_start();
echo 'ページ #1 へようこそ';
$_SESSION[' favcolor'] = 'green ';
$_SESSION['animal'] = 'cat';
$_SESSION['time'] = time();
// クライアントが使用する場合Cookie を使用すると、セッションを page2.php
echo '
page 2';
/ に直接渡すことができます。 / クライアントが Cookie を無効にしている場合
echo '
page 2';
? >
// page2.php
session_start();
print $_SESSION['animal'] // 単一セッションを出力します
var_dump ($_SESSION); // page1.php によって渡されたセッション値を出力します
?>
2.3 ページ キャッシュを制御するにはセッション関数を使用します。
多くの場合、たとえば、Web ページに機密性の高いコンテンツがあり、ローカルにキャッシュされている場合は、それを表示するためにログインする必要があります。ログインせずにローカル キャッシュを直接開き、Web ページを参照できます。
session_cache_limiter('private'); を使用して、session_start() の前に呼び出す必要があります。
その他のパラメータについては、http://blog.chinaunix.net/u/27731/showart.php?id= 258087 クライアント キャッシュ制御を参照してください。
クライアント キャッシュ時間を制御するには、session_cache_expire(int); を使用します。 s)。これは session_start() の前にも呼び出す必要があります。
これはセッションを使用する場合にのみ当てはまります。キャッシュを制御するには、header() でコントロール ページのキャッシュを制御することもできます。
2.4 セッション
の削除には 3 つの手順が必要です。
session_destroy(); // 最初の手順: サーバー側のセッション ファイルを削除し、
setcookie(session_name(),'') を使用します。 , time()-3600); // 2 番目のステップ: 実際のセッションを削除します:
$_SESSION = array( ; これは適切ではありません。現時点での最良の方法は、データベースを使用してセッションにアクセスすることです。関数 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. この関数を使用します。 storage
からセッション データをロードするとき 4. bool write() 指定されたセッション ID のすべてのデータを storage
に書き込みます。 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 '),
)
6 を呼び出しますclassName クラスの静的メソッド。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 の有効性を確認することです。
if(!isset($_SESSION['user_agent'])){
$_SESSION['user_agent'] = $_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT'];
}
elseif ($_SESSION['user_agent'] ! = $_SERVER ['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT']) {
session_regenerate_id();
}
?>
2.8 Cookie を通過するセッションと SID を通過するセッションの違い:
php5.2.1 のセッションのデフォルト設定では、セッションが生成されると、サーバーはヘッダーの set-cookie を送信するときに、事前定義されたスーパー グローバル変数 SID を生成します (つまり、cookie を書き込んで SID をスローします)。 $_COOKIE['PHPSESSID'] が存在する場合、Cookie は書き込まれなくなり、スーパー グローバル変数 SID は生成されなくなります。このとき、SID は空になります。
2.9セッションの使用例
function sessionVerify() {
if(!isset($_SESSION['user_agent'])){
$_SESSION['user_agent '] = MD5( $_SERVER['REMOTE_ADDR']
.$_SERVER['HTTP_USER_AGENT']);
}
elseif ($_SESSION['user_agent'] != MD5($_SERVER) ['REMOTE_ADDR']
.$_SERVER['HTTP_USER_AGENT'])) {
session_regenerate_id();
}
}
function sessionDestroy() {
session_destroy();
setcookie(session_name(),'',time()-3600);
$_SESSION = array();
}
?>
注:
セッション ヘッダー情報が送信される理由は、Cookie の場合と同じです。
php5 では、php セッションのすべてのレジストリ設定オプションは、通常の状況ではプログラムで設定可能です。設定を変更する必要はありません。PHP のセッション レジストリ設定オプションを理解するには、マニュアルのセッション処理関数を参照してください。
セッションにデータを保存する場合、$_SESSION 配列をシリアル化して保存されます。シリアル化に問題があるため、特殊文字が含まれる可能性のある値は、base64_encode 関数でエンコードしてから、
を読み取るときに Base64_decode でデコードする必要があります。