防止socket.IO垃圾套接字



我正在使用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个玩家并最终导致服务器崩溃。我该如何预防呢?我知道你必须使用某种速率限制。我不知道如何获取套接字的ip。

我正在使用套接字。io v4

我该怎么做?

查看https://socket.io/docs/v3/server-api/,您可以使用socket.handshake.address获取连接客户机的IP。之后,你需要建立一个服务器端数组或对象,包含ip以及他们所做的请求数量,这样你就可以建立一个速率限制器,检查他们在最后几分钟内所做的请求数量,你也可以完全阻止来自同一连接的新请求,或者创建一个新的播放器。

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

您还可以访问请求对象中的请求头,从中可以对它们进行数字指纹。然而,一个更好的解决方案,而不是陷入与GDPR或侵犯人们的隐私的麻烦,也许是将uid值存储为cookie/localStorage,并让客户端将其作为请求头传递。在这种情况下,它们将无法生成自己的uuid,您可以非常有目的地针对它们的uuid来限制/阻塞它们在套接字事件上的速率。然而,这与一开始就使用他们的IP是一样的。

如果不使用一些唯一标识符,如IP或uid,并在服务器端建立速率限制器,我看不出有什么方法可以实现你想要的。除此之外,你可以使用像cloudflare这样的安全服务来限制你的速率,https://blog.cloudflare.com/cloudflare-traffic/,在那里你可以对认证令牌进行速率限制,除其他事项外,但我认为如果你需要立即阻止一个事件,即使在第二次调用(我不知道他们的规则是否允许这种级别的配置),它将不起作用。

最新更新