1

我一直在尝试解决这个问题一段时间。

我已经构建了一个在我们客户的服务器上运行的应用程序。客户必须为每个用户购买许可证才能使用该系统。因此,每个用户在他/她的计算机上都有一个链接,可以仅使用该计算机访问应用程序。每台计算机都必须为每个用户注册并存储在数据库中。

所以我必须限制用户使用另一台计算机/设备访问应用程序。我的问题是如何使用 php(或任何其他语言)从每台计算机捕获唯一信息,以便每次用户尝试登录时都可以检查此信息。我了解到您只能使用 php 获取浏览器信息。所以我正在寻找一些可以引导我走向正确方向的想法。

我尝试的是在每台 PC 中存储唯一的 cookie,并将它们注册到数据库中。但问题是我们总是遇到一些用户清除他们的 cookie 从而无法访问应用程序的问题。

4

2 回答 2

5

将用户链接到计算机不是一个好主意。为什么要先创建一个 Web 应用程序的独立性和灵活性(假设它是一个 Web 应用程序,因为它是 PHP,或者您实际上有命令行用户?),然后将其限制在单个设备上,这可能会中断,被盗……也许公司没有为每位用户设置固定的工作地点,但它为大量兼职员工使用较少数量的计算机,因此每个用户每天可能使用不同的计算机。

如果你真的想要这样的限制,你最好只限制每个用户的会话数。即:在表中记录会话 ID 和这些会话的用户名。在每个请求上,更新表以存储请求日期时间,以便您可以检查过期会话。使用 MySQL,您可以制作存储类型的表,该表MEMORY速度快,对于会话信息非常有用。当您重新启动数据库服务器时,数据将消失,但这通常不是此类信息的问题。

现在,有继续的可能性:

  1. 如果用户在另一台 PC 或浏览器上再次登录,它将收到一个新的会话 ID。在这种情况下,在登录过程中,您可以查看会话表以查看用户是否打开了另一个会话 ID。如果是这样,请阻止登录。

    如果会话超时,例如超过 15 分钟,您可以允许登录并删除旧会话。

    缺点是如果浏览器或 PC 崩溃,用户必须等待超时时间才能继续在另一个位置工作。这在任何工作环境中可能都是不可接受的。

  2. 更好的解决方案可能是:用户只能有一个“活动”会话。如果用户从另一个工作区登录,他们将自动获得一个新会话。如果发生这种情况,您可以只接受新会话并删除旧会话 ID。如果他们继续使用旧会话,您可以看到该会话不再在会话表中,需要他们再次登录。

    使用该解决方案,用户将能够在工作区之间快速切换,而无需等待,但如果两个用户同时使用相同的用户名,则几乎每个请求都必须重新登录。

但我真的会三思而后行:你到底为什么想要这个限制?如果一家公司愿意使用超过允许的用户数量的软件,他们也愿意只是更改您的 PHP 代码以删除此检查,这将是微不足道的。

此外,如果您使用软件太烦人,他们可能会决定根本不使用它并寻找替代方案。我认为最好相信你的客户。

于 2012-12-03T10:13:34.857 回答
0

我不认为你可以只使用 PHP 来归档它。PHP 在服务器上运行,您可以从那里检索的唯一客户端信息是 IP,它不起作用,因为它可以是动态的,或者如果所有用户在同一个 LAN 中,则它们都相同。

想法是使用在客户端中运行的东西,然后 javascript 作为一个好主意弹出,但它有一个问题:用户可以看到它,他可以看到它如何检查或检索信息,所以操纵它的行为是相当的简单的。即使您要从 javascript 中检索用户的 MAC,它也不起作用,因为 MAC 可以更改。

我认为您应该在客户端中安装某种类型的 exe(例如 C、C++、C#、java),以确保它们无法从任何其他计算机或设备登录。当然,这应该在用户使用 Web 应用程序之前安装并通知用户。

另一方面,你为什么要做一个只能在 1 台 PC 上运行的网络应用程序?我的意思是网络应用程序的一大优点是它们几乎可以在任何 PC/设备中使用。

于 2012-12-03T10:13:20.353 回答