お世話になります。
現在、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で質問しましょう!
似たような質問が見つかりました
- LINE LINEの不正ログインについて パソコン等からのログインは拒否設定していますが、万が一スマホから不正 1 2023/06/18 12:49
- その他(動画サービス) OKWAVE ログインと会員登録 13 2023/04/09 15:40
- Chrome(クローム) Google Chrome の同期が必ず一時停止になってしまい困っています。 GoogleChrom 2 2023/02/04 16:45
- LINE PCでラインを使う場合について教えてください。 3 2023/07/10 11:07
- 会社設立・起業・開業 e-Gov電子申請アプリケーションからGビズIDのアカウントをログアウトしたい 1 2023/07/04 20:21
- Chrome(クローム) Google Chrome の同期が必ず一時停止になってしまい困っています。 GoogleChrom 1 2023/02/05 09:59
- デスクトップパソコン Google Chrome の同期が必ず一時停止になってしまい困っています。 GoogleChrom 1 2023/02/05 19:19
- タブレット Linuxパソコンからのログインと表示される 1 2023/04/12 15:58
- PHP 「teratail」での回答内容がいまいちわかりません。 1 2022/09/10 05:05
- ハッキング・フィッシング詐欺 OKWAVEのログインと会員登録と新規登録 1 2023/04/10 17:09
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ログインしたら他からログイン...
-
URLのパラメータをGETのままで...
-
session_start()で生成されるセ...
-
!issetの冒頭の!ビックリマー...
-
複数のサーバで運営する場合の...
-
session_set_save_handler と ...
-
webシステムでクッキーを使いた...
-
PHPのセッション有効期限について
-
ブラウザを閉じた後もセッショ...
-
特定のページからのみのアクセス
-
セッションのスコープ(有効範...
-
プログラミングPHP内でのSQL文...
-
別ブラウザ間でセッションの値...
-
switch()文で値の大小比較
-
「取得先」という表現について
-
【C#】DataGridViewの最大列数...
-
Dosブロンプトでtabを出力したい
-
shシェルスクリプト 空白行の...
-
phpでcookieがうまく保存されない
-
DTOとEntityの差は何ですか。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
URLのパラメータをGETのままで...
-
PHPのセッション有効期限について
-
PHPのセッションについて
-
ブラウザを閉じた後もセッショ...
-
Sessionの上限について
-
$_SESSIONと、POSTやGETの違い
-
ログインしたら他からログイン...
-
複数のサーバで運営する場合の...
-
301リダイレクトはセッション引...
-
「戻る」ボタンで値の保持
-
セッションのスコープ(有効範...
-
セッション ID とセッション名...
-
ログイン画面をはさんだ後、自...
-
session_start()で生成されるセ...
-
管理者としてログイン
-
セッション変数にパスワードを...
-
セッションを維持したまま、サ...
-
PHP cookieの値が更新されない...
-
セッションが正しく更新されな...
-
POSTで情報を他のサーバーに渡...
おすすめ情報