2006年11月19日

セッションを考える。その1

例えばブログのログインとかゲームユーザーの管理とかで便利だろうと言うことも含めて
PHPの基本機能としてのセッションについてしらべてみた。
まぁ実際はソケットの前にほとんどやっている。
安直にやると意外と問題がありそうなので、まず基本となる要素をみてみる。

PHPの前にPerlだが
こちらもセッションの概念はあるのだが非標準ぽいのは他のものと同じ
CGI::Session
PHP::Session
Apache::Session
とあるようだ。
クッキーまたはクエリー文字列としてユニークな識別子を作り
それに結合させたファイルないしはデータベースをサーバーが確保することで
ユーザーを識別するのだが

速度的メリットが無いのならば素直にMySQLあたりで組んだ方が良さそうな感じだ、
但し
Apache::Session::PHP

PHP::Session
はPHPで作ったものとやり取りできそうなので使うならばこれだろう。

データベースは一見よいきもするのだが
OSのファイルシステムと言うものがそもそも一種のデータベースである事も
無視できない事実だと言うことを再認識した。
またPHPをメインとした場合、普通にhttpリクエストで操作するのも手のはずだ。

で肝心のPHPだ。
こちらはほぼ標準になっているがどうもセキュリティ強化などで
ブレはあるようだ。
PHP5.1以降を中心に考えたいが実のところs216サーバーはPHP4だ。

セッションハイジャックの話とかいろいろ見てまわった結果
とりあえず考えた基本系が以下のもの


session_name('SES1')
session_start();
if (
!isset($_SESSION['_CHK']) ||
($_SESSION['_CHK']['ADDR'] != $_SERVER['REMOTE_ADDR']))
{
session_regenerate_id(true);
$_SESSION['_CHK'] = array(
'ADDR' => $_SERVER['REMOTE_ADDR'],
'startTime' => time(),
'cnt' => 0,
);
}
$_SESSION['_CHK']['cnt']++;


IPのシェア環境でのアクセスを廃絶しているがセキュアなサイトではこれでいいだろう。
この場合はパラメータ付で移動しているのでブラウザーを閉じるとファイルは削除される。
アドレスとアクセス回数を基本データとして持たせて
あてずっぽうな不正アクセスを防ぐようにしてみた。
ほんとはsession_save_path("/SES1");のようにしたかったのだが
どうもsafemodeだとできないようだ。


session_regenerate_id(true);

はPHP5.1以降有効なコードでファイルを明示的に削除する。

あと初期の資料の

session_unset();//セッションデータの破棄
session_register(変数名) ;//セッション用データの設定

は使わない方が良くて


$_SESSION=array();//セッションデータの破棄
$_SESSION['名称']変数

を使うようにするようだ。
クッキーを使うのがデフォルトだがgetやpostでも使える。
今回は一般ユーザー用だが例えばperlでセッションを組まずhttpで呼び出しても良いわけで
その場合はリモートアドレスのチェックは邪魔になるわけだ。

php.iniは共用サーバーの場合変更できないので「基本セット」が結構長くなった。
これはrequireとかincludeなどした方がいいのかもしれない。
これでセッションが使えるようになったがよく考えてみると
「一般データアクセス」と「購入アクセスセッション」と「ログインユーザーのアクセス」と3通りあるし
XMLSocketサーバーとのリンケージも考えられる。
またセッションIDについては任意設定とクッキーと両方考えられる。
無駄にデータが大きい必要性はないので具体的に有効な活用法を考察してみたい。



ラベル:PHP セッション
posted by Xo_ox at 23:49| Comment(0) | サーバーサイド手習い | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。