【问题标题】:Node and Socket.io ... prevent outside clients from connecting?Node 和 Socket.io ... 阻止外部客户端连接?
【发布时间】:2015-05-04 19:48:55
【问题描述】:

您好,我的 Web 应用程序有一个聊天室问题。通过调查,我认为它与设置 origins 选项有关?但我对此表示怀疑,并希望能帮助我朝着正确的方向前进。简而言之,我发现不直接在我的网页上的用户只需在其客户端脚本中添加connect(ip:port) 函数即可轻松连接到聊天端口。需要什么安全机制来防止这种访问。此外,我并没有使用 node.js 来实际提供网页,而是使用 laravel。 Node 主要实现聊天功能,将消息传递给客户端和从客户端传出,并将它们存储在内存中。

我希望我的问题足够清楚,如果没有让我知道

【问题讨论】:

  • 我遇到了完全相同的问题,看起来其他聊天网站能够连接到我的聊天服务器。你是如何限制这种情况发生的?我的服务器在节点 js 套接字 io 上。
  • 嘿@Faizan 正如下面的答案所指出的,解决方案是引入一个类似于任何传统 API 服务的验证系统。例如,节点服务器可以使用用户名/密码验证新连接,然后使用唯一生成的令牌进行回复。从那里开始,客户端可以将该令牌作为“身份证明”发送,并且节点服务器将在执行任何后续操作之前验证该令牌。现在请记住,我提供了一个非常高级且简化的解决方案,只是为了帮助您了解这个想法。每种方法各有利弊。

标签: javascript node.js laravel socket.io


【解决方案1】:

基于浏览器的 webSocket 连接(例如,从浏览器中的 Javascript 发起的连接)可以通过正确的服务器端设置限制为“同源”,以便只有您自己站点的网页可以连接。这是因为浏览器合作并宣布连接来自的合法来源,因此服务器可以决定传入连接是否合法。

非基于浏览器的 webSocket 连接,例如从另一台服务器或浏览器外部的某些脚本建立的连接不能限制在同一来源(因为没有受信任的代理设置它们来自的来源)。如果您想控制这些类型的连接,您将需要某种身份验证方案或 API 密钥或类似的东西,或者放弃对其进行监管并以其他方式控制您需要控制的任何内容(速率限制、用户登录、检测非- 人脉关系等...)。

在这方面,webSocket 连接与 ajax 连接确实没有什么不同。如果一个网页可以使用它,那么它对整个互联网几乎都是开放的,除非你实施某种身份验证方案。

【讨论】:

  • 嘿,非常感谢您的回答,这些问题现在更有意义了。所以它真的归结为在服务器上采取控制措施,以便验证每个尝试的套接字连接?我的下一个明显问题是什么措施最适合我的情况。在这些情况下更常用的是什么。另外,“放弃监管”是什么意思?
  • @MrSSS16 - “放弃监管”意味着你不用担心谁连接(当浏览器 JS 被允许连接时,这是一个难题,因为它对每个人都开放看看它在做什么),而是你担心他们在连接时会做什么,所以他们不会做客户端不应该做的事情(比如自动响应太快或淹没太多命令或任何可能导致你悲伤的事情系统)。您可以要求用户登录,或者您可以在您的网站上使用现有用户身份验证,然后如果您检测到行为不端的用户,您可以禁止该用户帐户。
  • 哦,我明白了……但这不会构成任何严重威胁。我可能错了,但如果他们可以连接,即使我通过验证/验证来调节它。他们建立联系的事实是否会带来任何问题?例如,如果我的服务器有一个发送消息的函数。他们通过自己的代码发出它......是否有一种措施来查看套接字发出是否经过身份验证就足够了?
  • @MrSSS16 - 我们真的需要了解您需要保护服务器或系统的具体细节。摘要中的答案是不可能的。侦听服务器发送的消息的 rouge 连接没什么大不了的——就像另一个连接的浏览器一样。恶意连接本身可能发送的消息的影响完全取决于具体情况,但在分析或保护方面与恶意 Ajax 请求对您的 Web 服务器的影响没有什么不同 - 完全相同的问题,完全相同的暴露。
猜你喜欢
  • 2014-12-16
  • 2020-11-20
  • 2022-06-20
  • 1970-01-01
  • 2020-02-03
  • 2017-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多