1

オンライン ソフトウェア アプリケーション用の認証、ACL、およびセッション管理システムが機能しています。これはユーザー アカウントごとの有料サービスであるため、PayPal がビジネス アカウントを管理するのと同じ方法で、従業員間でユーザー アカウントを共有できないようにする必要があります。

私の苦労は、有能で技術的なユーザーがJavascriptを変更したり、クライアント側のプロキシを使用したりすることによって回避できなかったような機能を実現する方法を見つけることです.

session_id (PK), session_user, session_data, client_ip, timestamp_created現在、各会社のアカウントには、サーバー上にデータベースがあり、列と列で構成される「セッション」テーブルがありtimestamp_updatedます。ユーザーがログインするたびに、session_user列はログイン名で更新されます。別のユーザーが別のマシンでそのアカウントにログインすると、以前にアクセスしたアカウントの session_user 列が に設定されNULLます。その結果、2 つの行が に対して同じ値を持つことはありませんsession_user。注目に値する可能性があるのは、顧客がデータベースへの管理アクセス権を持っていないことです。

クライアント側アプリケーションは、5 秒ごとにタイマーで Javascript 関数を実行し、Zend コントローラーへの AJAX 呼び出しを実行します。session_userこのコントローラーは、を使用して DB クエリを介してアクティブなセッションの列をチェックしますZend_Session::getId();。このメソッドは、データベースに が関連付けられている場合、または列に値がない場合に設定されたechoJSON エンコードされた応答です。メソッドが を返した場合、Javascript 関数は、別のマシンがアカウントにログインしたことをユーザーに警告し、ログイン ページにリダイレクトします。successTRUEsession_idsession_userFALSEsession_userFALSE

このアプローチの問題点は、Chrome のインスペクタまたは Mozilla の FireBug の経験がある人なら誰でも、AJAX 呼び出しを実行する Javascript を削除して、多数のマシンでアプリケーションを使用できることです。さらに悪いことに、この簡単な方法は脆弱性の始まりにすぎません。

preDispatch()Zend のプラグイン アーキテクチャを調べて、現在のsession_id値が対応するsession_userテーブルに設定されていることを確認するためのチェックを実装する必要があると感じています。このチェックは、私のユーザーの大半が基本的な「ハッキング」自体に精通しておらず、アカウントの共有を防ぐために見つけるだけだと思う​​ので、現在の構造を補完するものです. リソースが要求されたときに発生するため、このサーバー側のチェックが失敗した場合、エラーがスローされ、要求されたデータがフロントエンドにプッシュされない可能性があります (製品を表示するためのデータなど)。

このアプローチは機能するように見えますか、またはそのような機能を実現するためのより良い方法はありますか? 私は、エンドユーザーにとって面倒なことをするのが良い考えかどうかについての議論に陥る SO の投稿をたくさん読みました。収益の大部分は企業アカウントが追加のユーザー アカウントを購入することに基づいているため、あらゆる種類のアカウントの共有を防止する必要性が非常に高いと判断しました。ユーザーが既存のセッションでアカウントにログインできないようにすることは、私が避けたいことです。信じられないかもしれませんが、ログインしている別のデバイスによってアクティブなセッションから追い出されて、ユーザーがいらいらすることを望んでいます。これにより、追加のユーザー ライセンスの購入が促進されると思うからです。

追加情報が必要な場合や、投稿で説明したことについて明確にする必要がある場合は、お気軽にお問い合わせください。

4

1 に答える 1

1
  1. を使用して、Web サイトでアクションが実行されるたびにユーザーの IP をデータベース エントリとして保存します$_SERVER['REMOTE_ADDR']
  2. 前のエントリのセッション データと一緒に IP が変更されているかどうかを確認します。変更されている場合は、ログアウトしてから再度ログインしてもらいます。

このように、別々のデバイスが同時に動作することはできず、結果として再ログインする必要がなくなります。

于 2012-07-16T16:44:39.277 に答える