忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2024/03/29 16:02 |
PHP1-7:セッション

HTMLにはセッション機能がありません。
セッションとは、簡単に言うとリクエスト間の繋がりです。
ある時ページAが呼び出され、次にページBが呼び出されたとして、そのAとBが同一人物から呼び出されたのか、それとも別人から呼び出されたのかがわかりません。
また、ページAからページBに情報を渡すといったこともできません。

要するにログイン認証のあるページが作れず、ショッピングカートも作れないということです。

それではあんまりなので、多くのサイトではPerlやPHP等の言語を用いてセッションを実装しています。

以下は、よく使われているセッションの仕組みです。

まずサーバ側で適当な文字列を用意し、クライアントのクッキーにセットします(セッションIDと呼ぶ)
クライアントはサーバにアクセスする度に、そのセットされたクッキーを送信します(ブラウザの仕様)
サーバ側ではクライアントが送ってきたセッションIDをチェックして、サーバに記録されているセッションIDと同じであれば同じクライアントのアクセスからだ、と判断します。

ショッピングカートを例に、実装の流れを考えてみましょう。

クライアントがカタログページにアクセスしてくる
     ・セッションIDを作成する
     ・クライアントのクッキーにセットする

クライアントが商品を注文した
     ・必要な情報を、セッションIDとセットにしてサーバで保存する

クライアントが買い物レジに移動した
     ・クライアントとサーバのセッションIDをチェックし、同じものを取り出して表示

以上のような流れとなります。
面倒そうですね。

上記の流れでは書いていませんが、実際には他にもセッションの有効期限を決めたり、不正なセッションIDがやってきた場合の処理など、実装しなければならないことがいろいろあります。
またセッションはセキュリティ上考慮すべき点も多いので、毎回考えながら行うのは大変です。
特にセッションIDが他者に漏れたりすると買い物され放題なので、実装には十分注意しなければなりません。

Perlではこのあたりの処理も自力で実行しなければなりません。
CGI::Session等のモジュールもありますが、それでも実装するにはやや敷居が高いのが実情です。

PHPでは、
session_start();
と書くだけであとはPHPが全ての管理を行ってくれます。

session_start();
と書くことで使えるようになるスーパーグローバル変数があります。
$_SESSIONです。
普通のローカル変数同様、普通に代入するだけで使えます。
自動的にクライアント毎に内容が振り分けられ、Perlで必要だったクライアントのセッションIDとサーバのセッションIDをチェックして云々、という処理が一切必要ないという恐ろしく便利な変数です。

フォームのスクリプトa.htmlとa.php、およびそれとは何の関係もないb.phpを用意します。

http://yuubiseiharukana.creativeroot.jp/php1/a.html
<form action="a.php" method="POST">
<input type="text" name="userid">
<input type="text" name="pass">
</form>


http://yuubiseiharukana.creativeroot.jp/php1/a.php
<?php
    session_start();
    $_SESSION['userid']=$_POST['userid']
    $_SESSION['pass']=$_POST['pass']
?>

http://yuubiseiharukana.creativeroot.jp/php1/b.php
<?php
 session_start();
 print_r($_SESSION);
?>

a.htmlでフォームを登録した後、適当に他のサイトを見て回った後でb.phpにアクセスすると、a.phpでセットした変数がしっかり表示されます。
有効期限は設定で変更できますが、デフォルトはブラウザを閉じるまでです。

他にもセッション名を指定する関数session_name()やセッションIDを取得する変数session_id()等セッションに関するいろいろな関数がありますが、使用法についてはまたそのうち。

ちなみにsession_start();しないとsession_id()は取得できませんが、クッキー自体は毎回送信されているはずで、実際$_COOKIE['PHPSESSID']で取得できます。

PR


2008/05/01 16:45 | Comments(0) | TrackBack() | PHP

トラックバック

トラックバックURL:

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<PHP2-1:アクセスカウンターを作ろう | HOME | その他1-3:セキュリティ対策3:クロスサイトリクエストフォージェリ>>
忍者ブログ[PR]