セッションの中国語訳は「会話」といい、本来の意味は、例えば電話をかけるときの、始まりと終わりのある一連の行為・メッセージのことです。電話を取ってからダイヤルし、電話を切るまでをセッションと呼ぶことができます。現在の社会におけるセッションの理解は非常に混乱しています。「ブラウザ セッション中、...」という言葉が時々見られますが、ここでのセッションはブラウザ ウィンドウが開いてから閉じるまでの期間を指します。 「セッション中のユーザー(クライアント)」という文に言及する場合、ユーザーの一連のアクション(通常は、ログインから商品の購入、チェックアウトまでなど、特定の目的に関連する一連のアクション)を指す場合があります。ただし、このようなオンライン ショッピング プロセスは、文脈からのみ推測できる場合もあります。 「接続指向」と「状態維持」には 2 つの意味があります。「接続指向」とは、通信する側が電話をかけるなど、通信する前に通信チャネルを確立する必要があり、相手が電話に出るまで通信を開始できないことを意味します。 「ステータスの維持」とは、通信相手が一連のメッセージを相互に依存できるようにすることを意味します。たとえば、ウェイターは、再び来た古い顧客を認識し、その顧客が最後に店に 1 ドル借りていたことを思い出すことができます。このカテゴリの例には、「TCP セッション」や「POP3 セッション」が含まれます。は文脈から推測して理解することしかできませんが、次のように理解できます。たとえば、電話をかけるとき、電話をかけた瞬間から電話を切る瞬間まで、通話は接続されたままであるため、この接続は次のようになります。通信状態はセッションと呼ばれ、クライアントが COOKIE をサポートしていない場合、データが正しく安全であることを保証するために常に存在します。変数は、Web サイトを訪問する訪問者に割り当てられます。これは、クライアントの Cookie に保存されるか、URL を通じて渡されます。
SESSION の発明により、HTTP プロトコルの制限が解消されます。 : HTTP プロトコルはステートレス プロトコルとみなされ、ユーザーの閲覧ステータスを知ることができません。サーバー側で応答が完了すると、サーバーはブラウザとの接続を失います。これは HTTP プロトコルの本来の目的と一致します。クライアントは、特定のファイルをダウンロードするようサーバーに要求するだけで済みます。クライアントとサーバーのどちらも、互いの過去のアクションを記録する必要はありません。顧客と自動販売機や通常の関係と同様です。非会員制)ハイパーマーケット
したがって、セッション(Cookie は別の解決策です)を使用して、ユーザーがこの ID として Web サーバーに再度リクエストを行うときに、確認のためにユーザーの関連情報を記録します。複数の情報ページを切り替えるときに保存します。ウェブサイトのプログラマーなら誰しも経験があると思いますが、各ページの変数は次のページでは使用できません(フォームやURLも実装できますが、非常に不十分な方法です)。一方、SESSIONに登録された変数はグローバルとして使用できます。変数。
それでは、SESSION の用途は何でしょうか?オンラインで買い物をするとき、誰もがショッピング カートを使用したことがあります。いつでも選択した商品をショッピング カートに追加し、最後にレジに行って会計を行うことができます。プロセス全体を通じて、ショッピング カートは選択した商品を一時的に保存する役割を果たします。これは、ユーザーの ID 認証やプログラムのステータスを追跡するために使用されます。記録、ページ間のパラメータの受け渡しなど。
COOKIE テクノロジーは SESSION の実装で使用され、SESSION は session_id (SESSION 番号) を含む COOKIE をクライアント側に保存し、session_name などの他のセッション変数をサーバー側に保存します。ユーザーがサーバーにリクエストを送信すると、session_id もサーバーに送信され、session_id を通じてサーバー側に保存されている変数を抽出することで、ユーザーが誰であるかを識別できます。 SESSION が時々失敗する理由を理解するのは難しくありません。
クライアントが COOKIE を無効にすると (IE の [ツール] - [インターネット オプション] をクリックし、ポップアップ ダイアログ ボックスで [セキュリティ] - [レベルのカスタマイズ] をクリックし、[会話ごとに COOKIE を許可する] を無効に設定します)、session_idは渡されず、SESSION は無効になります。ただし、php5 は、linux/unix プラットフォーム上の Cookie ステータスを自動的にチェックできます。クライアントが無効になっている場合、システムは自動的に session_id を URL に追加して渡します。 Windows ホストにはこの機能がありません。
Session の一般的な関数と使用法
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_start() を呼び出す必要がなくなります。ただし、このオプションの有効化にはいくつかの制限があります。session.auto_start が実際に有効化されている場合、セッション内でオブジェクトを再作成するには、セッションを開始する前にクラス定義をロードする必要があるため、オブジェクトをセッションに配置することはできません。
登録されたすべての変数は、リクエストの完了後にシリアル化されます。登録されているが定義されていない変数は、未定義としてマークされます。これらの変数は、ユーザーが後で定義しない限り、その後のアクセスでもセッション モジュールによって定義されません。
警告: 一部の種類のデータはシリアル化できないため、セッションに保存できません。循環参照を持つリソース変数またはオブジェクトを含めます (つまり、あるオブジェクトがそれ自体への参照を別のオブジェクトに渡します)。
SESSION 変数の登録:
PHP5 は $_SESSION[‘xxx’]=xxx を使用して SESSION グローバル変数を登録します。 GET、POST、COOKIEの使用方法は同様です。
注: session_register()、session_unregister、session_is_registered は、php.ini で register_globle が on に設定されていない限り、php5 では使用されなくなりました。ただし、セキュリティ上の理由から、 register_globle をオフにすることを強くお勧めします。 HTTP_SESSION_VARS の使用は推奨されなくなり、代わりに $_SESSION を使用することが公式に推奨されています。例:
Page1.php
view plaincopy to Clipboardprint?
Session_start(); //この関数は SESSION を使用する前に呼び出す必要があります。
$_SESSION['name']="NowaMagic"; //SESSION 変数を登録します
$_SESSION['passwd']="hellomagic";
echo '
Pass SESSION through COOKIE'; //クライアントが Cookie をサポートしている場合、このリンクを通じてセッションを次のページに渡すことができます。
echo '
URL 経由で SESSION を渡す';//クライアントが Cookie をサポートしていない場合は、このメソッドを使用します。 pass session //
echo date('Y m d H:i:s', $_SESSION['time']);
echo '
?>
セッション ID を渡すには 2 つの方法があります:
1 つは Cookie で、もう 1 つは URL パラメーターです。 。
セッションモジュールは両方の方法をサポートします。 Cookie はより最適化されていますが、常に利用できるわけではないため、代替手段も提供されています。 2 番目の方法では、セッション 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();
セッション Cookie を使用する場合、session_id() 値が指定されている場合、session_start() が開始されるたびに Cookie 値がクライアントに送信されます。現在の session_id が指定された値と等しいかどうかは関係ありません。
session_id() 値が指定されていない場合は、現在の session_id() が返され、現在のセッションが開始されていない場合は、空の文字列が返されます。
以前の php バージョンでは、セッションが存在するかどうかを確認するために通常 session_is_register() が使用されていましたが、$_SESSION['XXX']=XXX を使用してセッション変数を登録すると、session_is_register() 関数は機能しなくなります。 。代わりに isset($_SESSION['xxx']) を使用できます。
Change session_id
session_regenerate_id() は、変更が成功した場合は true を返し、失敗した場合は false を返します。 この関数を使用すると、現在のセッションの session_id を変更できますが、現在のセッションの他の情報は変更されません。例:
クリップボードプリントへのプレーンコピー?
session_start();
session_regenerate_id();
エコー「オリジナル」セッションID: $old_sessionid
";
echo "新しいセッションID: $new_sessionid
";
print_r($_SESSION);
?>
session_name()現在のセッションの名前を返すか、現在のセッションの名前を変更します。現在のセッションの名前を変更する場合は、session_start() の前にこの関数を呼び出す必要があります。注: session_name は数字だけで構成することはできません。少なくとも 1 つの文字を含める必要があります。それ以外の場合は、毎回新しいセッション ID が生成されます。セッション名の変更例:
view plaincopy to Clipboardprint?
$previous_name = session_name("WebsiteID");
echo "新しいセッション名: $previous_name";
セッションを削除する方法
unset ($_SESSION['xxx']) は単一のセッションを削除し、unset($_SESSION['xxx']) は登録されたセッション変数の登録を解除するために使用されます。その機能は session_unregister() と同じです。 session_unregister() は PHP5 では使用されなくなったため、廃止される可能性があります。 unset($_SESSION) この関数は使用してはなりません。グローバル変数 $_SESSION が破壊され、それを復元する適切な方法はありません。ユーザーは $_SESSION 変数を登録できなくなります。
$_SESSION=array() 複数のセッションを削除します。
session_destroy() 現在のセッションを終了し、セッション内のすべてのリソースをクリアします。この関数は、現在のセッションに関連するグローバル変数の設定を解除 (解放) しません。また、クライアントのセッション Cookie を削除しません。 PHP のデフォルトのセッションは Cookie に基づいています。Cookie を削除したい場合は、setcookie() 関数を使用する必要があります。戻り値: ブール値。関数の説明: この関数は現在のセッションを終了します。この関数にはパラメータがなく、戻り値は true です。
session_unset() $_SESSION が使用されている場合、この関数は機能しなくなります。 PHP5 は $_SESSION を使用する必要があるため、この関数は脇に追いやられる可能性があります。
セッションを削除するための公式の PHP ケースは次のとおりです:
view plaincopy to Clipboardprint?
// セッションを初期化します。
/**※すべてのセッション変数を削除する unset($_SESSION[xxx]) を使用して 1 つずつ削除することもできます。 ****/
$_SESSION = array();
/***セッション ID を削除します。セッションはデフォルトで Cookie ベースであるため、setCookie を使用してセッション ID を含む Cookie を削除します。***/
if (isset($_COOKIE[session_name()]))
{ setcookie(session_name(), '', time()- 42000 , '/');
}
// 最後にセッションを完全に破棄します。
?>
; ここから、セッションを削除する手順を導き出します。
$_SESSION=array()/unset($_SESSION['xxx'])
session_destroy()
SESSION security:
セッションモジュールは、セッションに保存された情報がユーザーのみに表示されることを保証できませんセッションを作成した人。保存されているデータに応じて、セッションの整合性を積極的に保護するためにさらに多くの手順を実行する必要があります。
セッション内で伝送されるデータを評価し、追加の保護措置を実装すると、多くの場合コストがかかり、ユーザーの利便性が低下します。たとえば、単純なソーシャル ポリシーからユーザーを保護したい場合 (注: URL に表示されるセッション ID は、コンピューター画面上の他のユーザーに表示されたり、HTTP リファラーなどを通じて他の Web サイトによって取得されたりします)、これを有効にする必要があります。 . session.use_only_cookies。この場合、クライアントは無条件で Cookie を有効にする必要があります。そうしないと、セッションは機能しません。
既存のセッション ID が第三者に漏洩する方法はいくつかあります。セッション ID が漏洩すると、第三者が指定された ID に関連付けられたすべてのリソースにアクセスできるようになります。まず、URL にはセッション ID が含まれています。外部サイトに接続すると、セッション ID を含む URL が外部サイトのリファラー ログに保存される場合があります。第 2 に、より積極的な攻撃者がネットワーク セグメント上のパケットを傍受する可能性があります。暗号化されていない場合、セッション ID はクリア テキストでネットワーク上を流れます。この問題を解決するには、サーバーに SSL を実装し、ユーザーに SSL の使用を強制します。
默认情况下,所有与特定会话相关的数据都被存储在由 INI 选项 session.save_path 指定的目录下的一个文件中。对每个会话会建立一个文件(不论是否有数据与该会话相关)。这是由于每打开一个会话即建立一个文件,不论是否有数据写入到该文件中。注意由于和文件系统协同工作的限制,此行为有个副作用,有可能造成用户定制的会话处理器(例如用数据库)丢失了未存储数据的会话。
上面介绍函数下文将会用到,但还有一些有关session的函数也介绍一下:
session_encode函数功能:sesssion信息编码函数原型:string session_encode(void);返回值:字符串功能说明:返回的字符串中包含全局变量中各变量的名称与值,形式如:a|s:12:"it is a test";c|s:4:"lala"; a是变量名 s:12代表变量a的值"it is a test的长度是12 变量间用分号”;”分隔。
session_decode函数功能:sesssion信息解码函数原型:boolean session_decode (string data)返回值:布尔值功能说明:这个函数可将session信息解码,成功则返回逻辑值true
PHP5 不再使用 session_id,而是把它变成一个常量 SID,并保存在 cookie 中。如果客户端禁用了 cookie,php 会自动通过 url 自动传动传递 SID,其条件是设置 php.ini 中的 session.use_trans_sid = 1。此时即使客户端即使禁用了 cookie 也没关系了。用 strip_tags() 来输出 SID 以避免 XSS 相关的攻击。
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跨页传递问题的三条途径:
设置 php.ini 中的 session.use_trans_sid = 1 或者编译时打开打开了 --enable-trans-sid 选项,让 PHP 自动跨页传递 session id。
手动通过 URL 传值、隐藏表单传递 session id。
用文件、数据库等形式保存 session_id,在跨页过程中手动调用。
下面举例说明:
第一种情况:
page1.php
view plaincopy to clipboardprint?
session_start();
$_SESSION['var1']="中华人民共和国";
$url="下一页";
echo $url;
?>
page2.php
view plaincopy to clipboardprint?
session_start();
echo "传递的session变量var1的值为:".$_SESSION['var1'];
?>
运行以上代码,在客户端cookie正常的情况下,应该可以在得到结果“中华人民共和国”。
ここで、クライアント上の Cookie を手動で閉じて再度実行すると、結果が得られない可能性があります。結果が得られない場合は、php.ini で session.use_trans_sid = 1 を設定するか、コンパイル時に --enable-trans-sid オプションをオンにすると、「中華人民共和国」という結果が得られます。
2 番目の方法:
s1.php
view plaincopy to Clipboardprint?
session_start()
$_SESSION['var1']="中華人民共和国"; sn = session_id();
//PHP5 は session_id() を表す定数 SID を定義します。$url=' と記述することもできます。次の 1 ページ';
$url="次のページ"; $url;
?>
s2.php
view plaincopy to Clipboardprint?
session_id($_GET['s']);
echo "渡されたセッション変数 var1 は次のとおりです: ".$_SESSION['var1'];
?>
3 番目の方法:
login.html
view plaincopy to Clipboardprint?
<フォーム名= "ログイン" メソッド= post" action="mylogin1.php">
ユーザー名:
パスワード:
mylogin1.php
$name=$_POST['name'];
if(!$name || !$pass ) {
echo "ユーザー名またはパスワードが空です。再度ログインしてください";
die();
}
if (!( $name=="laogong" && $pass=="123")) {
echo "ユーザー名またはパスワードが間違っています。再度ログインしてください"
die();
}
//登録ユーザー
ob_start();
$_SESSION['user']= $name;
$fp=fopen(" e:\tmp\phpsid.txt","w+");
fwrite($fp,$psid);
fclose($fp);
//認証成功、関連操作を実行
echo "ログイン< ;br>";
echo "次のページ";
?>
mylogin2.php
view plaincopy to Clipboardprint?
< ?php
$fp=fopen("e:\tmp\phpsid.txt","r");
$sid=fread($fp,1024);
session_id( $sid);
session_start();
if(isset($_SESSION['user']) && $_SESSION['user']="laogong" )
{
else
{
//関連する操作を実行するために正常にログインしました
echo "ログインしていません。アクセスできません";