我的在线软件应用程序具有正常运行的身份验证,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 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帖子,这些帖子在最终用户上是否如此繁琐是一个好主意。我们已经决定,由于收入主要基于购买额外用户帐户的公司帐户,因此非常需要阻止任何类型的帐户共享。阻止用户登录现有会话的帐户是我想要避免的。信不信由你,我宁愿让用户因为登录其他设备而被活动会话启动而烦恼,因为我觉得这会鼓励购买额外的用户许可证。
请随时询问您是否需要任何其他信息,或要求澄清我在帖子中描述的任何内容。
答案 0 :(得分:1)
$_SERVER['REMOTE_ADDR']
在您的网站上将操作作为数据库条目存储时,存储用户的IP。这样,单独的设备无法同时执行操作而不必重新编译。