我的在线软件应用程序有一个功能正常的身份验证、ACL 和会话管理系统。由于这是基于每个用户帐户的付费服务,因此我需要确保用户帐户不能以与 PayPal 管理企业帐户相同的方式在员工之间共享。
我的斗争是找到一种方法来实现这样的功能,一个有能力的技术用户无法通过修改 Javascript 或使用客户端代理来规避。
目前,每个公司帐户在我的服务器上都有一个数据库,其中包含一个由session_id (PK), session_user, session_data, client_ip, timestamp_created
和timestamp_updated
列组成的“会话”表。每当用户登录时,该session_user
列都会更新为他们的登录名。如果另一个人在另一台机器上登录该帐户,则先前访问的帐户的 session_user 列将设置为NULL
。结果是任何两行都不应该具有相同的值session_user
。可能值得注意的是,客户没有对其数据库的管理访问权限。
客户端应用程序每 5 秒在计时器上运行一个 Javascript 函数,该函数执行对 Zend 控制器的 AJAX 调用。该控制器session_user
使用 . 通过 DB 查询检查活动会话的列Zend_Session::getId();
。此方法echo
是 JSON 编码的响应,success
如果TRUE
在数据库中session_id
有关联,或者列中没有值,则设置为。如果该方法返回,Javascript 函数会继续提醒用户另一台机器已登录到他们的帐户,然后将他们重定向到登录页面。session_user
FALSE
session_user
FALSE
这种方法的问题在于,任何对 Chrome 的检查器或 Mozilla 的 FireBug 有经验的人都可以删除执行 AJAX 调用的 Javascript 并继续在许多机器上使用该应用程序。更糟糕的是,这种简单的方法只是漏洞的开始。
我有一种感觉,我需要研究 Zend 的插件架构,也许在此期间实施检查preDispatch()
以确保当前session_id
具有在相应session_user
表中设置的值。此检查将与我当前的结构相辅相成,因为我觉得我的大多数用户本身并不精通基本的“黑客”,并且会发现以防止帐户共享。如果这种服务器端检查失败,因为它发生在请求资源时,可能会抛出错误并且请求的数据不会被推送到前端(例如用于查看产品的数据)。
这种方法看起来会起作用吗,还是有更好的方法来实现这种功能?我已经阅读了一堆 SO 帖子,这些帖子引发了关于最终用户如此繁琐是否是一个好主意的争论。我们已经决定,由于收入主要基于购买额外用户帐户的公司帐户,因此非常需要防止任何形式的帐户共享。我想避免阻止用户使用现有会话登录帐户。信不信由你,我宁愿让用户被另一台登录的设备从他们的活动会话中引导出来而烦恼,因为我觉得这会鼓励购买额外的用户许可证。
请随时询问您是否需要任何其他信息,或者需要澄清我在帖子中描述的任何内容。