Servidor de puntuaciones

B

Buenas! pues hoy os traigo una duda existencial sobre como implementar un servidor de puntuaciones.... el problema es el de validar que el record enviado es legítimo y no a causa de una modificación en el código.

El circuito normal sería:

  • Cliente pide mapa al servidor
  • El servidor envía mapa
  • Cliente envía inicio de partida
  • Servidor empieza a contar el tiempo
  • Cliente envía fin de partida --> En este punto, alguien puede modificar el código para enviar esta petición al momento que quiera y joder el sistema.
  • Servidor guarda tiempo

¿Se os ocurre alguna forma para evitar este fraude? Siempre pensando que el usuario tiene acceso al código.

¿Toda solución pasa por implementar todo (tipo de juego, físicas, ...) del lado del servidor? :/

Wasd

Se me ocurre ir pasándole la puntuación al servidor conforme avanza la partida, y que el servidor vigile si hay alguna irregularidad, como un pico muy bestia. Depende de las mecánicas de tu juego, claro.

Implementar los cálculos en el lado del server es lo ideal, pero claro eso generará lag y tendrás que implementar sistemas de predicción en el código del cliente.

No soy un experto, si alguien sabe mas, que seguro que si, que nos ilumine!

1
Meleagant

#1 La única forma de validar al 100% que la puntuación es correcta es correr la lógica del juego en el servidor.

A medio camino hay otras técnicas, por ejemplo recoger ciertos parámetros del juego y validar que el resultado es compatible con ellos. Claro que los parámetros se pueden falsear, pero siempre es más difícil eso que cambiar un número.

1 1 respuesta
kesada7

Te dejo este video desde el minuto que explica lo que quieres hacer creo, pero es solo una forma de complicarle la vida un poco al que quiera trastear con los valores.

1 respuesta
B

#4 Gracias por el video! me lo he visto enterito... pero no me sirve la solución que aporta ya que el código de mi juego es accesible a cualquiera y pueden modificarlo a voluntad. Además, no me convence como intenta resolver el problema... con software tipo "CheatEngine" para android te lo sacas fácil... En ningún momento comprueba que la puntuación sea legítima... encripta el valor si, pero a la hora de recuperarlo le trae al pairo si la operación XOR es "genuina".
Ten en cuenta que este tipo de software se basa en los cambios de datos en memoria... si veo que al saltar y comer manzanas X valor en memoria cambia puedo deducir que ese valor es el que esta usando el juego para mostrar la puntuación... me da igual que no ponga los 20 puntos que llevo :P

1 respuesta
totespare

Viendo lo que comenta #3 se me ocurre que lo que se envíe al servidor sea la partida en sí, y que en el servidor se haga una simulación rápida del mismo, y saque la puntuación debida. Claro está, si es un juego muy tocho, pues lo mismo no es viable, pero si es un jueguecillo simplón, alomejor sí renta mirarlo.

1 respuesta
B

#5 Prueba SafeFloat

Lo malo es que te obliga a hacer cosas fuera del Inspector de Unity ya que no sirven desde ahí.

1 respuesta
B

#6 Suena interesante, pero demasiado complejo... xD
#7 No uso unity :/ y además se tiene acceso al código. Pero gracias, igual a otra personal le sirve ;)

Finalmente optaré, si hago un ranking, de hacer el juego 100% online... es un tema que he tocado pero nunca he implementado desde cero... es algo que llevo arrastrando años y creo que ya va siendo hora de meterse manos a la obra con el "netcode"...

B

Da igual que encriptes la data, da igual si usas copias de respaldo encriptadas, da igual chequeos con timer, da igual que reposiciones en la memoria la variable, da igual que uses otro proceso para hacer los controles.

Depende del usuario target, pero si quieres 100% de seguridad, creo que la única forma de escapar a un buen debugger es alojar la lógica lejos del alcance del usuario... al menos no he encontrado ningún juego con lógica en el cliente que no pudiera trucar.

Usar un servidor autoritativo... y aún así depende del uso de buenas prácticas.

1
B

Esta clarinete... pasar la lógica del juego del lado del servidor requiere controlar lag, anti-flood, anti-spoofing, etc.. etc.. xDD no es para nada una tarea sencilla... pero bueno no tengo calendario, ni jefe, ni beneficio... puedo ir con calma y sobretodo aprendiendo por el camino :P

r2d2rigo

Parate a pensar un momento: de verdad, de VERDAD va a beneficiarte en algo hacer un cambio tan radical? Esperas que tu juego lo jueguen miles de personas, como para que entre ellas haya gente tan dedicada como para perder un buen rato haciendo ingenieria inversa para subir un high score?

1 1 respuesta
B

.

1 respuesta
r2d2rigo

#12 si vas a tirar por esos lares, esta serie de articulos son la biblia: https://gafferongames.com/post/introduction_to_networked_physics/

1

Usuarios habituales