【问题标题】:Prevent socket.io spamming sockets防止 socket.io 向套接字发送垃圾邮件
【发布时间】:2021-12-13 17:17:47
【问题描述】:

我正在使用 socket.io 制作多人游戏。这是我的服务器代码的一部分。

io.on('connection', (socket) => {
    console.log("socket has connected!!")
    socket.on("go", (name) => {
       addPlayer(name);
    })
    
    socket.on("move", (angle) => {
     //do movement stuff
    })
})

现在人们通过创建垃圾邮件套接字使我的服务器崩溃。他们正在打开控制台并在客户端中输入此代码:

setInterval(() => {
var socket = io()
socket.emit("go", "haha ugothacked")
},10)

这会每秒创建 100 个玩家,最终导致我的服务器崩溃。我该如何防止这种情况。我知道你必须使用某种速率限制。我不知道如何获取socket的ip。

我正在使用 socket.io v4

我该怎么做?

【问题讨论】:

  • 这些都不适合我。我已经尝试了所有这些
  • 是你无法获取他们的IP地址还是它不断变化的问题?您使用的是什么版本的节点/套接字?
  • nodejs 16,socket v4.1,我没有他们的ip,我如何限制它。

标签: javascript node.js sockets socket.io spam-prevention


【解决方案1】:

查看https://socket.io/docs/v3/server-api/,可以使用socket.handshake.address获取连接客户端的IP。之后,您需要构建一个包含 ips 的服务器端数组或对象以及它们发出的请求数量,这样您就可以构建一个速率限制器并检查他们在过去几分钟内发出了多少请求,您可以也只是完全阻止来自同一连接的新请求或创建新播放器之类的事情。

您还可以强制人们在玩游戏之前创建一个帐户并验证他们的电子邮件,但这可以使用 https://temp-mail.org/en/ 之类的东西在 10 秒内完成,因此虽然这可能是一个额外的保护层并减慢他们的速度下来,它不会阻止你的问题。

您还可以访问请求对象中的请求标头,从中您可以对它们进行数字指纹识别。然而,一个更好的解决方案可能是将 uuid 值存储为 cookie/localStorage 并让客户端将其作为请求标头传递,而不是遇到 GDPR 问题或侵犯人们的隐私。在这种情况下,他们将无法仅生成自己的 uuid,您可以非常有目的地将他们的 uuid 定位为在套接字事件上限制/阻止它们。然而,这与一开始就使用他们的 IP 有点像。

如果不使用一些唯一标识符(如 IP 或 uuid)并建立速率限制器服务器端,我看不出有一种方法可以实现您想要的。除此之外,您可以使用 cloudflare 之类的安全服务为您进行速率限制,https://blog.cloudflare.com/cloudflare-traffic/,您可以在其中对 auth 令牌进行速率限制,但我认为如果您需要立即阻止甚至在第二次调用时也发生事件(我不知道他们的规则是否允许该级别的配置)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-10
    • 2013-09-20
    • 2013-07-01
    • 1970-01-01
    • 2017-08-31
    • 1970-01-01
    相关资源
    最近更新 更多