[PHP-users 28655] Re: 同時アクセスがあった場合のエラー処理

Shu Sawada luna @ lunanet.gr.jp
2006年 3月 8日 (水) 18:31:59 JST


さわだと申します。

> もし、同会員IDで2ユーザー以上の同時アクセスがあった場合は
> 後から接続したユーザーの画面にエラーメッセージを表示させる
> 仕様を考えています。

同時アクセスのエラー処理というより、同時ログインの制御というイメージで
良いでしょうか?
30秒以内に次のページへアクセスしても問題ないですよね?


> 1.初回認証時、会員認証が成功した時点で、クッキーにランダムな
>   英数字(以降、キー文字)を書き込む
>
> 2.データベースの会員トランザクションファイルに[書き込み時間],[会員ID],
>   [キー文字]を書き込む
>
> 3.次回認証時にクッキーの[キー文字]とデータベースの[キー文字]が違う、かつ
>   データベースの[書き込み時間]から5分以内の場合はエラーメッセージを出力
>   
> 以上を検討しています。(それでも瞬間的な同時アクセスしか防げないですが^^;)

要するに

- ログイン時
  - とりあえずsession_start()
  - sessionに会員ID等が存在していない場合で、DBの過去ログイン時刻が5分より短ければ弾く
  - OKであれば
	- 会員IDをsessionに設定 ($_SESSION["user_id"] = $hogehoge)
	- DBにログイン時刻を書き込む ( insert into ... )
	- 各webページでは、sessionが存在していればログイン済みユーザとみなす

という処理と結果としては違わないんじゃないかなと思うんですが(違ったらごめんなさい)、
これだと、普通の認証プロセスに過去ログイン時刻の制約をつけただけの形だと思うので、
5分以内に複数のユーザがログインできる事態は制御できると思います。
5分以上経ってれば制御できないですが、、、

> 質問2:なにかもっと良いやり方ってありますか?

良いというのが、何をもって良いとするのかという話もあるかと思うんですが、
例えば絶対1つのブラウザしか見てはいけなくて、全てPHPで処理するページなら

- 自前管理テーブルを作る
	会員ID, session_id, timestamp
- ログイン時
	- 管理テーブルに会員IDで検索して結果行があったら全てdelete
		delete from 管理テーブル where 会員ID;
	- sessionを作るときに、管理テーブルにログイン状態をinsert
		insert into 管理テーブル ...
- 各ページでの前処理
	- 通常のsession有無(無ければ当然弾く)
	- session_id(session_id()で参照とか)で管理テーブルを検索
		select count(*) from 管理テーブル where session_id = ''
		- 管理テーブルに行がなければ弾く
			- ここに行が無いのは、ログアウト済みか二重ログインした場合
- ログアウトしたら管理テーブルからdelete

みたいなアプローチじゃダメでしょうか?
二重ログインしたら、既にログインしているユーザが以後ページを参照できなくなります。
やったこと無い上に単なる思いつきなんで抜けあったらすみませんです。

-----
Shu Sawada
http://luna.lunanet.gr.jp/


PHP-users メーリングリストの案内