
お世話になります。
現在、Linux Apache Mysql Phpのシステムで会員制の動画閲覧システムを開発中です。
接続時間による従量制の課金システムのため、同じIDでの使いまわしを対策する必要があり、二重ログインを禁止するようにしたいのです。
単純にDBでログインフラグを設定すればよいと思ったのですが、その場合、ログアウトボタンでログアウトしてもらわないとログイン状態が保持されてしまうため、クライアントが不意のフリーズなどで再起動となった場合再ログインが出来ないということになってしまいます。
何か、Webのシステムで完全に二重ログインを防止し、ログアウトボタン以外でのログアウトした場合にもしっかり「ログアウト」とみなす対応のできる方法はないでしょうか?
教えてください、お願いします。
A 回答 (6件)
- 最新から表示
- 回答順に表示
No.6
- 回答日時:
>接続時間による従量制の課金システムのため、同じIDでの使いまわしを対策する必要があり、二重ログインを禁止するようにしたいのです。
固定料金制のサイトでは、IDの使い回しの恐れがあるので、「二重ログインを禁止したい」というのは理解できるのですが。。。 従量制ならば、二重ログインされたらその分だけ課金できるようになっていればいいんじゃないでしょうか。
まあその辺は置いておいて。二重ログイン防止の話を。
セッションを使うならば、
・ユーザIDごとのログイン状態をDBなどで管理する
・session_set_save_handler() を使って独自のハンドラ関数を定義
・独自のハンドラ関数では、DB内のログイン状態を適宜参照/変更する
- ログイン時にDBにレコードを生成(既存レコードがあればエラー)
- ログアウトやガーベージコレクトの際に、DBのレコードを削除
のような作りにする必要があると思います。
私自身は、かつて上記のような二重ログイン防止のための概要方式検討をしたのですが、結局のところ実装・導入はしませんでした。ですので、上記の方式には検討が甘い部分があるかもしれません。プロトタイプを作るなどして検証する必要があるかと思います。
■補足
(1)
セッションを使わずとも、セッションに似たような仕組みをアプリケーションで作りこめば、二重ログイン管理は可能です。そっちの方が、融通がきいていいかもしれません。
(2)
セッションを単純に使うだけでは、二重ログインは防止できません。
(3)
セッションのガーベージコレクト(タイムアウト)の際に、DBのレコードを削除してやれば、フリーズやブラウザのウィンドウを閉じた場合にも、一定時間待てばログイン可能になります。ただ、ANo.3さんのような方式を取り入れれば、タイムアウト時間を短くする→待ち時間を短くすることができます(さらに複雑な作りこみをすれば、待ち時間をゼロにできるはずです)。
(4)
企業内のユーザなどプロキシを使うユーザは、同一者であってもアクセスのたびにIPアドレスが変わることがあるため、IPアドレスを識別に使うのには無理があります。
(5)
AさんがアカウントXYZでログインしてセッションID Cookieを取得して、そのセッションIDをBさんに教えるような攻撃もありえます。Bさんは自分の端末のブラウザに、教えて貰ったCookieをセットすれば、AさんとBさんは同時に同一アカウント(XYZ)でサービスを使えるようになります。このあたりは、ある程度対策方法がありますが、完全に止めることは出来ないと思います。
No.5
- 回答日時:
ID,IP,ログイン時間で管理。
一定時間内で同じIDで異なるIPの場合ははじくとか。
もしくは一定時間内で同じIDだけど、IPが異なる場合が数回起こった場合にエラーを出すとか。
一定時間とか数回とかの調整をすればある程度ははじけると思います。
ただ、どっちのIDが正しいと言う判断が出来ないのでどちらともID停止処理になると思います。
No.4
- 回答日時:
WebサーバとPHPとWebブラウザだけで実現するのは、ちょっと思いつきません。
(A)ログイン状態のまま一息ついている間に、別の人が別端末から同じIDでログインしてきた
(B)ログイン状態のまま端末がフリーズしたので、同じ人が別端末から同じIDでログインしてきた
サーバはこの2つを識別できないので、ログアウトとみなしてよいのか判断できないでしょう。
クライアント側で動作スクリプトかアプリを併用して、ユーザが操作していなくても定期的にクライアントとサーバが交信するようにし、一定時間以上交信が途絶えたら端末フリーズや回線断と判断してログアウトとみなすような形しか思いつきません。

No.3
- 回答日時:
ログイン状態をブラウザのセッションクッキー
(ブラウザを閉じたら消えるクッキー)で保持するようにすると
良いと思います。
が、同時にログインしない使い回しまで禁止する方法は、むずかしいですね。
たとえば、ログインIDを、開示したくないようなモノにする
(メールアドレスとか個人情報とか・・・)など、どうでしょうか。
No.2
- 回答日時:
ログインされている、と言う事をとりあえずWEBページが表示されている、と言う事にしましょう。
PHPだけではクライアントのWEBページが開いているか開いていないかは判断出来ません。これを手伝ってくれるのはクライアント側のスクリプトしかありません。
有効なスクリプトとしては、JavaScriptかFlashかと思います。一般的にはJavaScriptでしょうか。
JavaScriptで定期的に(settimeout( "function" ,1000) )サーバと通信し、ログイン状態保持させることが可能かと思います。トラフィックを考えて定期起動させるスクリプトを指定します。
定期起動させるスクリプトとしては、イメージ表示がいちばん手っ取り早いでしょう。イメージのURLにloginnow.php?uid=xxxxxxxxxのようなセッションIDをもたせてやれば良いです。
> 接続時間による従量制の課金システムのため
このスクリプトを利用すればページを表示させている間の時間も取得可能です。
参考まで。
No.1
- 回答日時:
セッションで管理していれば何も問題ないと思うのですが…
テスト中のセッション管理画面があるのでお試しください。
http://fk2.jp
ID:test3@yam.jp
PASSWORD:password
ID:test4@yam.jp
PASSWORD:password
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
完全なセッション破棄をしたい
-
PHP4からPHP5へ移行した際、セ...
-
「取得先」という表現について
-
開始と終了を指定して、その間...
-
DTOとEntityの差は何ですか。
-
Dosブロンプトでtabを出力したい
-
WordでExcelデータを差込...
-
VBA内でのGetPixelを使用した時...
-
VB.NETからVBAマクロ(引数)を呼...
-
INIファイル
-
PHPでの画像の形式の変換
-
Worksheet_Changeについて
-
ps3で久しぶりにCDの音楽情報取...
-
C言語で地図を描きたい
-
ローカルのコンピュータ名を取...
-
ミュージックのアートワークを...
-
C#で特定LANアダプタの状態を取...
-
PLY yacc での IF 文実装
-
過去にVBAでの「シフト表の何日...
-
classの再定義エラーについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
URLのパラメータをGETのままで...
-
セッションのスコープ(有効範...
-
ログイン画面をはさんだ後、自...
-
PHPのセッション有効期限について
-
Cookieを利用したユーザ管理
-
sessioncookieをではなくcookie...
-
Sessionの上限について
-
■(ログイン)セッションの有効期...
-
!issetの冒頭の!ビックリマー...
-
session_unsetを使う利点
-
セッション変数にパスワードを...
-
複数のサーバで運営する場合の...
-
セッション変数で定数を宣言す...
-
セッションファイルの有効期限...
-
ブラウザを閉じた後もセッショ...
-
セッション ID とセッション名...
-
別ブラウザ間でセッションの値...
-
SESSION情報は、ブラウザを起動...
-
複数ページでセッションを使わ...
-
"セッションハンドラ"とは
おすすめ情報