【问题标题】:How to restrict access to web application to one machine only?如何将 Web 应用程序的访问限制在一台机器上?
【发布时间】:2010-07-06 18:46:35
【问题描述】:

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

请告诉我您认为最好的解决方案。如果这很重要,我的后端是 php/mysql。

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

【问题讨论】:

  • 添加了 PHP 和 MySQL 标签。
  • IP 不是一个好的解决方案 - 路由器后面可以有多台计算机,因此它们在访问您的站点时都具有相同的 IP。
  • 为什么要建立这个限制?我使用几台机器访问多个站点,如果您不允许我也从其他计算机访问您的站点,我会非常生气。也许相关:Creating a PHP web app to allow users to vote on submissions - How can I minimize abuse?
  • @Marcel Korpel:我记得不得不处理用户编辑同一个页面,但从两个不同的浏览器窗口...

标签: php mysql security login restrict


【解决方案1】:

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

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

【讨论】:

  • +1:知道的唯一方法是检查用户是否已经登录。
  • 我想做类似的事情,你的第二点我不清楚,请详细告诉我。
【解决方案2】:

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

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

【讨论】:

  • 您仍然可以导出证书并将其复制到您的家用 PC。
【解决方案3】:

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

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

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

【讨论】:

  • 这可能是一个基于内部的应用程序。如果它是在单个域上运行的系统。 IP 将更具可预测性,但仍不是唯一的(取决于 IP 获得的租约)
【解决方案4】:

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

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

更新

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

【讨论】:

  • 浏览器不向服务器发送MAC地址
  • 它们也不保证是唯一的。我见过一些旧的 SUN 盒子,它们可以让你通过 DIP 开关设置 MAC。
  • 好的,你可以在 IE 上使用 ActiveX 或者为其他浏览器开发插件,例如可以读取 MAC 地址的 firefox/safari/chrome。
【解决方案5】:

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

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

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

【讨论】:

    【解决方案6】:

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

    【讨论】:

    • 是的,你到底为什么要这样做......??
    • 我认为有时,即使您不同意他们的要求,您也必须假设有原因。在这种情况下,声明这是客户的请求(通过编辑)。问题不在于他们是否应该这样做,而在于他们如何去做。另外,这是一个有趣的思考。它在某些方面违反了基于 Web 的应用程序的概念(通过将个人用户限制在个人机器上来挑战分布式性质),但它至少可能是一个有趣的挑战
    • 如果客户问如何最好地跳下桥,我应该发帖“用你的脚”吗?
    • 与客户的讨论和开发人员只是传达客户的意愿是有区别的。如果客户一心想要做一些疯狂的事情并且付钱给开发人员做这件事,他为什么不伸出手问“怎么做?”
    • 在这里提问是我研究的一部分,因此我可以向客户解释所有可能的影响。正如我所说,我同意它的可怕想法,但“不要那样做”不太可能帮助我的事业。也看不出客户为什么会问我如何最好地跳下桥。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-01
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    • 2016-07-18
    相关资源
    最近更新 更多