Estoy haciendo un juego multijugador usando socket.io. Aquí hay una parte de mi código de servidor.
io.on('connection', (socket) => { console.log("socket has connected!!") socket.on("go", (name) => { addPlayer(name); }) socket.on("move", (angle) => { //do movement stuff }) })Ahora la gente está colapsando mi servidor creando sockets de spam. Están abriendo la consola y escribiendo este código en el cliente:
setInterval(() => { var socket = io() socket.emit("go", "haha ugothacked") },10)Esto crea 100 jugadores cada segundo y eventualmente bloquea mi servidor. ¿Cómo evito esto? Sé que tienes que usar algún tipo de límite de velocidad. No sé cómo obtener la ip del socket.
Estoy usando socket.io v4
¿Cómo hago esto?
Mirando https://socket.io/docs/v3/server-api/ , puede usar socket.handshake.address para obtener la IP del cliente que se conecta. Después de eso, debe crear una matriz u objeto del lado del servidor que contenga las ip junto con la cantidad de solicitudes que han realizado para que pueda crear un limitador de velocidad y verificar cuántas solicitudes han realizado en los últimos minutos, puede también simplemente bloquee por completo las nuevas solicitudes de la misma conexión o cosas como crear un nuevo jugador.
También puede obligar a las personas a crear una cuenta y validar su correo electrónico antes de jugar su juego, pero eso se puede hacer en unos 10 segundos usando algo como https://temp-mail.org/en/ , por lo que si bien podría ser un extra capa de protección y los ralentiza, no evitará su problema.
También puede acceder a los encabezados de solicitud en el objeto de solicitud, desde ahí puede tomarles una huella digital. Sin embargo, una mejor solución, para no meterse en problemas con GDPR o violar la privacidad de las personas, es tal vez almacenar un valor uuid como cookie/almacenamiento local y hacer que el cliente lo pase como un encabezado de solicitud. En ese caso, no podrán simplemente generar su propio uuid y usted puede apuntar a su uuid a propósito para limitarlos/bloquearlos en eventos de socket. Sin embargo, esto es más o menos lo mismo que usar su IP en primer lugar.
No veo una forma en que pueda lograr lo que desea sin usar un identificador único, como una IP o un uuid, y crear un lado del servidor limitador de velocidad. Aparte de eso, puede usar un servicio de seguridad como cloudflare para establecer un límite de tasa para usted, https://blog.cloudflare.com/cloudflare-traffic/ , donde puede establecer un límite de tasa en el token de autenticación, entre otras cosas, pero creo que no funcionará si necesita bloquear inmediatamente un evento incluso en una segunda llamada (no sé si sus reglas permiten ese nivel de configuración).