防止众多设备同时登录到单个用户帐户

时间:2012-07-16 15:53:29

标签: php zend-framework session login

我的在线软件应用程序具有正常运行的身份验证,ACL和会话管理系统。由于这是基于每个用户帐户的付费服务,因此我需要确保无法以与PayPal管理业务帐户相同的方式在员工之间共享用户帐户。

我的奋斗是找到一种方法来实现这样的功能,以便有能力的技术用户无法绕过修改Javascript或使用客户端代理。

目前,每个公司帐户在我的服务器上都有一个数据库,其中包含一个“会话”表,其中包含session_id (PK), session_user, session_data, client_ip, timestamp_createdtimestamp_updated列。每当用户登录时,session_user列都会使用其登录名进行更新。如果其他人在另一台计算机上登录该帐户,则先前访问过的帐户会将session_user列设置为NULL。结果是没有两行应该具有session_user的相同值。可能值得注意的是,客户没有对其数据库的管理访问权。

客户端应用程序每隔5秒在一个计时器上运行一个Javascript函数,该函数对Zend Controller执行AJAX调用。此控制器使用session_user通过数据库查询检查活动会话的Zend_Session::getId();列。如果echo在数据库中具有关联的success,则此方法TRUE是一个JSON编码的响应,session_id设置为session_user,或FALSE如果session_user列中没有值。如果该方法返回FALSE,则Javascript函数继续警告用户另一台计算机已登录其帐户,然后将其重定向到登录页面。

这种方法的问题在于,任何具有Chrome检查员或Mozilla FireBug经验的人都可以删除执行AJAX调用的Javascript,并继续在众多计算机上使用该应用程序。更糟糕的是,这种简单的方法只是漏洞的开始。

我有一种感觉,我需要查看Zend的插件架构,可能会在preDispatch()期间执行检查,以确保当前session_id在相应的session_user表中设置了值。这个检查对我目前的结构是免费的,因为我觉得我的大多数用户本身并不精通基本的“黑客”,并且会发现只是为了防止帐户共享。如果此服务器端检查失败,就像请求资源时发生的那样,可能会引发错误,并且不会将请求的数据推送到前端(例如,用于查看产品的数据)。

这种方法是否会起作用,或者是否有更好的方法来实现此类功能?我已经阅读了一些SO帖子,这些帖子在最终用户上是否如此繁琐是一个好主意。我们已经决定,由于收入主要基于购买额外用户帐户的公司帐户,因此非常需要阻止任何类型的帐户共享。阻止用户登录现有会话的帐户是我想要避免的。信不信由你,我宁愿让用户因为登录其他设备而被活动会话启动而烦恼,因为我觉得这会鼓励购买额外的用户许可证。

请随时询问您是否需要任何其他信息,或要求澄清我在帖子中描述的任何内容。

1 个答案:

答案 0 :(得分:1)

  1. 每次使用$_SERVER['REMOTE_ADDR']在您的网站上将操作作为数据库条目存储时,存储用户的IP。
  2. 检查IP是否与上一个条目中的会话数据一起更改 - 如果是,请让他们注销并重新登录。
  3. 这样,单独的设备无法同时执行操作而不必重新编译。

相关问题