5

我需要确保每个访问我的 Web 应用程序的用户只能从一台机器上执行此操作,因此 100 个用户意味着 100 台机器。最好的解决方案是什么?在首次登录时检测和存储 IP 是个好主意吗?我认为即使在会话的生命周期内,IP 也可能会发生变化,对吗?我还考虑在用户首次登录时存储 cookie。然后将这些 cookie 分配给用户,就像我已经对密码和用户名所做的那样,并且每次访问应用程序时都会检查该 cookie 的存在。

请让我知道您认为最好的解决方案是什么。如果这很重要,我的后端是 php/mysql。

编辑:我需要澄清......这是对正常会话管理的补充。我需要限制用户只能从一台特定的机器登录到 Web 应用程序。因此,如果用户最初在工作时从他的计算机登录并且我存储了它的 ip/cookie/等,那么客户端注销(甚至没有),回家并尝试登录将无法做到这一点。我同意它的可怕想法,但客户坚持:)

4

6 回答 6

7

对于移动客户端或在有线和无线网络之间切换的客户端,IP 地址可能会发生变化。您最好的选择可能是在每个客户端首次连接时为其提供一个随机生成的 UID(如果它还没有 cookie)。然后您可以检查相同的用户名是否没有使用两个不同的 UID 进行连接。

诀窍是您需要确保将此 UID 超时,这样如果用户转到另一台计算机,他们就不会被锁定。也许对 UID 进行一次更改是可以的,但他们不能回到已经使用过的 UID?

于 2010-07-06T18:54:20.677 回答
2

您可以通过向客户端颁发使用 keygen 元素创建的客户端 SSL 证书来限制单个用户代理,这使浏览器生成一个密钥对,将私钥保存在用户代理中,然后您会收到一个 SPKAC,您可以使用 openssl 创建一个证书,然后您将其发送回用户代理,它会安装它,并且从那时起,它只能通过 HTTP+TLS 用于在该特定浏览器中识别用户。

其他任何事情,根本不会 100% 起作用 - 尽管您可以破解看似有效的方法(直到出现问题并且它不起作用):)

于 2010-07-06T20:49:00.803 回答
0

最好的解决方案已经内置到 Web 服务器中,具体取决于您使用的是哪一个。这就是会议的目的。在 ASP.NET/IIS 中,通常每个会话超时 20 分钟。

因此,如果用户使用另一台计算机访问您的 Web 应用程序,则会话超时将释放空闲计算机的连接。

更新

您可能需要考虑通过他们机器的唯一 MAC 地址来限制用户。

于 2010-07-06T18:57:34.847 回答
0

不幸的是,IP 不是特定于机器的,原因有很多:

  1. IP 地址可能会在会话期间更改,恕不另行通知(用户甚至可能不知道)
  2. 大多数用户都有动态IP,所以它肯定会在某个时候改变
  3. 对于笔记本电脑、平板电脑或手机等机器,IP 地址基于当前的服务提供商
  4. 代理背后的所有用户在您看来都是一个 IP,因此您仍然无法检测到他们是否从一台机器移动到另一台机器

相反,为会话生成某种唯一密钥并结合用户名对其进行跟踪。如果相同的用户名已经在另一个活动会话中,请阻止他们登录。(您还需要一些方法来自动刷新这些,以防您丢失会话结束事件。)

于 2010-07-06T18:58:29.537 回答
0

如果它是一个仅在公司内部使用的非常内部的应用程序,则可以定义一个 IP 范围,因为不在全球范围内运营的小型公司可能会从其互联网访问提供商那里获得一定数量的 IP。

您还可以考虑使用 $_SERVER 中的一些信息将用户限制为单个 Web 浏览器 (HTTP_USER_AGENT) 和单个端口 (REMOTE_PORT) 的组合 - 作为区分机器的另一种方法。

但是所有这些解决方案都不好或更糟,从技术上讲可能无法解决这个问题(除非您的客户保证所有机器都将保持静态 IP,在这种情况下,如果其他问题是微不足道的)。

于 2010-07-07T08:04:39.090 回答
-3

不要那样做。许多人会从多台计算机访问您的网站,如果您阻止他们,他们会抱怨。

于 2010-07-06T18:53:46.417 回答