2010-07-06 44 views
3

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

请让我知道你认为什么是最好的解决方案。如果有问题,我的后端是php/mysql。

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

+0

添加了PHP和MySQL标签。 – mcandre 2010-07-06 18:53:59

+0

IP不是一个好的解决方案 - 多台计算机可以位于路由器后面,因此在访问您的站点时它们都具有相同的IP。 – 2010-07-06 18:57:30

+0

为什么你想建立在这个限制?我使用多台机器访问多个站点,如果您不允许我从其他计算机访问您的站点,我也会非常不高兴。也许相关:[创建PHP Web应用程序,以允许用户对提交投票 - 我如何最小化滥用](http://stackoverflow.com/questions/2602702/creating-a-php-web-app-to-allow-用户对票上提交 - 如何-可以-I-最小化)? – 2010-07-06 19:12:31

回答

6

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

诀窍是您需要确保将此UID取出,以便在用户转到其他计算机时不会锁定。也许对UID的一个改变是可以的,但是他们不能回到已经使用过的UID?

+1

+1:只有知道的方法是检查用户是否已经登录。 – 2010-07-06 18:58:04

+0

我想做类似的事情,你的第二点不清楚,请详细告诉我。 – 2013-05-03 06:02:32

-1

不要这样做。许多人会从多台电脑访问您的网站,如果您阻止他们,他们会投诉。

+0

是的,为什么你会这样做......? – Zak 2010-07-06 20:03:26

+3

我觉得有时候,即使你不同意他们的要求,你也得假设有理由。在这种情况下,声明这是客户的请求(通过编辑)。问题不在于他们是否应该,而在于他们是如何做到的。另外,这是一个有趣的想法。它在某些方面藐视基于网络的应用程序的概念(通过将个人用户限制在单独的计算机上来反抗分布式特性),但它至少可能是一个有趣的挑战 – 2010-07-06 21:44:40

+0

如果客户问如何最好地跳过桥,我应该发布“用你的脚?” – mcandre 2010-07-07 13:09:14

0

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

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

UPDATE

你可能要考虑他们的机器都有它独特的MAC地址限制用户。

+0

MAC地址不会通过浏览器发送到服务器 – 2010-07-06 20:50:25

+0

它们也不保证是唯一的。我见过一些旧的SUN盒子,可以让你通过DIP开关设置MAC。 – Curtis 2010-07-06 21:07:38

+0

好的,你可以使用ActiveX for IE或为其他浏览器开发插件,例如可以读取MAC地址的firefox/safari/chrome。 – SoftwareGeek 2010-07-08 00:47:01

0

不幸的是,一个IP是不是机器特有的多种原因:

  1. 的IP地址可以在会话期间发生变化,不另行通知(用户可能甚至不知道它)
  2. 最用户具有动态IP,所以它最肯定会在某个时刻
  3. 的机器,如笔记本电脑,平板电脑或手机改变,IP地址是基于当前的服务提供商
  4. 背后代理的所有用户都将出现你作为一个单一的IP,所以你仍然无法解决如果他们从一台机器移动到另一台机器

取而代之的是,为会话生成某种唯一密钥并将其与用户名一起进行跟踪。如果同一用户名已在另一个活动会话中,请阻止他们登录。(您还需要一些方法来自动刷新这些内容,以防万一您丢失了会话结束事件。)

+0

这可能是一个基于内部的应用程序。如果它是在单个域上运行的系统。 IP将更具可预测性,但仍不是唯一的(取决于IP获得的租赁) – 2010-07-06 21:47:13

2

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

别的,是行不通的100% - 尽管你能砍出现工作方式(直到出了问题,它不工作):)

+0

您仍然可以导出证书并将其复制到您的家用PC。 – grundprinzip 2011-06-04 06:32:10

0

如果它是一个非常内部的应用程序,将仅用于公司内部,因此可以定义IP范围,因为在全球范围内不运营的小公司可能会从其互联网接入提供商处获得一定数量的IP。

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

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

相关问题