Tengo un sitio web simple con un pequeño juego. Tiene un marcador básico que usa express: cada vez que muere, el sitio web envía una solicitud de publicación al servidor con su puntaje y el servidor lo agrega a la tabla de clasificación. Mi problema es que es muy simple explotar la clasificación. a través de devtools, las personas pueden simplemente:
Pensé en crear un contador de puntuación del lado del servidor y un verificador de colisiones, pero mi juego tiene un ritmo rápido, así que creo que esto sería problemático, sin hablar de la potencia informática que pondría en el servidor si varias personas juegan al mismo tiempo.
¿Es esta realmente la única solución o hay soluciones más simples en las que no estoy pensando?
código del servidor:
const express = require('express'); const app = express(); const fs = require('fs'); const { json } = require('express'); app.use(express.json()); app.use(express.urlencoded({extended:true})); app.use(express.static('Build')) app.get('/leaderBoard', (req,res)=>{ var rawData = fs.readFileSync('./database.json'); var data = JSON.parse(rawData); res.json(data); }) app.post('/leaderBoard', (req, res)=>{ var rawData = fs.readFileSync('./database.json'); var leaderBoard = JSON.parse(rawData).leaderBoard; for(var i = 0; i < leaderBoard.length; i++){ if(req.body.score > leaderBoard[i].score){ for(let i2 = leaderBoard.length -1; i2 > i; i2--) leaderBoard[i2] = leaderBoard[i2-1]; leaderBoard[i] = req.body; break; } } fs.writeFileSync("./database.json",JSON.stringify({leaderBoard},null,2)); }) app.listen(process.env.PORT || 3000);Una verificación del lado del servidor sería imperativa si realmente desea evitar cualquier trampa... PERO, siempre puede hacer que sea más difícil hacer trampa en el lado del cliente con controles simples, como definir un cambio de puntaje máximo (por ejemplo, si alguien gana más de 100 puntos en 1 segundo, entonces está haciendo trampa).
El uso de un código minimizado no puede hacer daño, y también puede reemplazar el nombre de sus variables por otros abstractos (a, b, c, en lugar de "puntuación"). Por esa misma razón, una verificación de colisión no debe definirse simplemente por un indicador de verdadero/falso.