WebSockets:如何识别通过同一网络连接的设备?

时间:2017-10-10 01:17:16

标签: javascript node.js websocket

假设我想限制单个设备上的连接数量到我的WebSocket服务器。为此,我可以比较IP地址,并拒绝重复的IP(如果每个设备的最大连接数为1)。但是,如果两个设备尝试使用相同的网络IP连接到我的服务器,则最后一个设备将被拒绝。

是否有其他方法来识别一个设备并拒绝超过最大WebSocket连接数量?

我正在使用Node.jswebsocket/ws模块。

2 个答案:

答案 0 :(得分:3)

此处唯一真正的解决方案是在获得对您的服务的任何有意义的访问权限之前要求帐户登录,并严格控制帐户的创建和分发方式。然后,您可以通过检查帐户是否已经并且当前已登录来轻松阻止来自同一帐户的多次访问。此方法还允许您在重复时实施速率限制,服务滥用检测甚至帐户禁止(暂时或永久)检测到滥用行为。

IP地址不是一个有意义的解决方案,因为当它们位于代理或NAT后面并且在这种情况下尝试使用IP地址时,您无法知道客户端的真实IP地址是什么错误地阻止大量合法用户,因为他们可能共享一个共同的互联网IP地址,即使他们在自己的本地网络上都拥有自己的私有IP地址。与Myst所写的相反,您的负载均衡器层无法可靠地访问真实的客户端IP地址,因此这不是应用层与网络层的问题。这是一个问题,你的连接结束(在所有层)不一定能访问真正的客户端IP地址(因为客户端代理和NAT)。

如果您只是想设置一些障碍以防止从同一浏览器中偶然或意外登录,并且您有某种原因您不想要求帐户登录,那么您可以在首次访问时对浏览器进行cookie操作,然后在后续访问时检查查看具有该cookie的浏览器是否已连接。这一点都不安全。失败(仅使用第二台浏览器,第二台计算机或禁用cookie)是微不足道的,但它确实阻止用户意外地执行此操作,甚至可能使一些非复杂用户无意中这样做。但是,它很容易被击败,因此cookie保护充其量只是一个微弱的障碍。

答案 1 :(得分:1)

我知道这可能不是你想要的答案,但是当你说完所有时你可能会得到答案:

应用层无法安全地解决连接限制(本质上是与安全相关的问题)。这应该由代理(或者有时是负载均衡器)层来解决,甚至这种方法也不是完全可靠的(由于数据有限以及互联网连接中涉及的众多中介)。

请考虑您的应用程序可以访问的远程IP不是真正的IP地址。

从套接字层收集数据时,应用程序可以访问代理的IP地址,主机层或其他中介......但不能访问客户端的实际IP地址。

从HTTP层收集数据时(由remoteAddress执行),收集的数据不可靠。它由客户提供,可以轻松篡改,伪造,欺骗等。

简而言之,应用程序没有足够的数据来实际实施此安全措施。

换句话说,应该在应用程序暴露给传入连接之前实现这个安全层,而不是应用程序层本身。

@NewToJS建议的解决方案是应用程序可以掌握的最佳方法 - 通过使用登录系统限制访问,其中只有注册用户可以建立持久连接,并且每个用户都可以限制可能的连接数(经常断开最旧的连接比拒绝新连接更好。