オンライン ソフトウェア アプリケーション用の認証、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();
。このメソッドは、データベースに が関連付けられている場合、または列に値がない場合に設定されたecho
JSON エンコードされた応答です。メソッドが を返した場合、Javascript 関数は、別のマシンがアカウントにログインしたことをユーザーに警告し、ログイン ページにリダイレクトします。success
TRUE
session_id
session_user
FALSE
session_user
FALSE
このアプローチの問題点は、Chrome のインスペクタまたは Mozilla の FireBug の経験がある人なら誰でも、AJAX 呼び出しを実行する Javascript を削除して、多数のマシンでアプリケーションを使用できることです。さらに悪いことに、この簡単な方法は脆弱性の始まりにすぎません。
preDispatch()
Zend のプラグイン アーキテクチャを調べて、現在のsession_id
値が対応するsession_user
テーブルに設定されていることを確認するためのチェックを実装する必要があると感じています。このチェックは、私のユーザーの大半が基本的な「ハッキング」自体に精通しておらず、アカウントの共有を防ぐために見つけるだけだと思うので、現在の構造を補完するものです. リソースが要求されたときに発生するため、このサーバー側のチェックが失敗した場合、エラーがスローされ、要求されたデータがフロントエンドにプッシュされない可能性があります (製品を表示するためのデータなど)。
このアプローチは機能するように見えますか、またはそのような機能を実現するためのより良い方法はありますか? 私は、エンドユーザーにとって面倒なことをするのが良い考えかどうかについての議論に陥る SO の投稿をたくさん読みました。収益の大部分は企業アカウントが追加のユーザー アカウントを購入することに基づいているため、あらゆる種類のアカウントの共有を防止する必要性が非常に高いと判断しました。ユーザーが既存のセッションでアカウントにログインできないようにすることは、私が避けたいことです。信じられないかもしれませんが、ログインしている別のデバイスによってアクティブなセッションから追い出されて、ユーザーがいらいらすることを望んでいます。これにより、追加のユーザー ライセンスの購入が促進されると思うからです。
追加情報が必要な場合や、投稿で説明したことについて明確にする必要がある場合は、お気軽にお問い合わせください。