アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になります。
現在、Linux Apache Mysql Phpのシステムで会員制の動画閲覧システムを開発中です。
接続時間による従量制の課金システムのため、同じIDでの使いまわしを対策する必要があり、二重ログインを禁止するようにしたいのです。

単純にDBでログインフラグを設定すればよいと思ったのですが、その場合、ログアウトボタンでログアウトしてもらわないとログイン状態が保持されてしまうため、クライアントが不意のフリーズなどで再起動となった場合再ログインが出来ないということになってしまいます。

何か、Webのシステムで完全に二重ログインを防止し、ログアウトボタン以外でのログアウトした場合にもしっかり「ログアウト」とみなす対応のできる方法はないでしょうか?

教えてください、お願いします。

A 回答 (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)でサービスを使えるようになります。このあたりは、ある程度対策方法がありますが、完全に止めることは出来ないと思います。
    • good
    • 0

ID,IP,ログイン時間で管理。


一定時間内で同じIDで異なるIPの場合ははじくとか。
もしくは一定時間内で同じIDだけど、IPが異なる場合が数回起こった場合にエラーを出すとか。

一定時間とか数回とかの調整をすればある程度ははじけると思います。
ただ、どっちのIDが正しいと言う判断が出来ないのでどちらともID停止処理になると思います。
    • good
    • 0

WebサーバとPHPとWebブラウザだけで実現するのは、ちょっと思いつきません。


(A)ログイン状態のまま一息ついている間に、別の人が別端末から同じIDでログインしてきた
(B)ログイン状態のまま端末がフリーズしたので、同じ人が別端末から同じIDでログインしてきた
サーバはこの2つを識別できないので、ログアウトとみなしてよいのか判断できないでしょう。

クライアント側で動作スクリプトかアプリを併用して、ユーザが操作していなくても定期的にクライアントとサーバが交信するようにし、一定時間以上交信が途絶えたら端末フリーズや回線断と判断してログアウトとみなすような形しか思いつきません。
    • good
    • 0

ログイン状態をブラウザのセッションクッキー


(ブラウザを閉じたら消えるクッキー)で保持するようにすると
良いと思います。
が、同時にログインしない使い回しまで禁止する方法は、むずかしいですね。
たとえば、ログインIDを、開示したくないようなモノにする
(メールアドレスとか個人情報とか・・・)など、どうでしょうか。
    • good
    • 0

ログインされている、と言う事をとりあえずWEBページが表示されている、と言う事にしましょう。


PHPだけではクライアントのWEBページが開いているか開いていないかは判断出来ません。これを手伝ってくれるのはクライアント側のスクリプトしかありません。
有効なスクリプトとしては、JavaScriptかFlashかと思います。一般的にはJavaScriptでしょうか。
JavaScriptで定期的に(settimeout( "function" ,1000) )サーバと通信し、ログイン状態保持させることが可能かと思います。トラフィックを考えて定期起動させるスクリプトを指定します。
定期起動させるスクリプトとしては、イメージ表示がいちばん手っ取り早いでしょう。イメージのURLにloginnow.php?uid=xxxxxxxxxのようなセッションIDをもたせてやれば良いです。

> 接続時間による従量制の課金システムのため
このスクリプトを利用すればページを表示させている間の時間も取得可能です。

参考まで。
    • good
    • 0

セッションで管理していれば何も問題ないと思うのですが…


テスト中のセッション管理画面があるのでお試しください。

http://fk2.jp

ID:test3@yam.jp
PASSWORD:password

ID:test4@yam.jp
PASSWORD:password
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!