¿Cómo protejo el envío de puntajes de juegos HTML5 a mi servidor?

13

En el backend estoy usando java. Tengo un juego en HTML5; cuando el usuario lo completa, envío una llamada Ajax para guardar la puntuación en la base de datos. Ahora, alguien puede usar fácilmente herramientas como Fiddler y firebug para modificar esta solicitud ajax y enviar una puntuación mucho mejor al servidor. ¿Cómo me aseguro de que el usuario no pueda manipular las puntuaciones!

Deepak Singhal
fuente

Respuestas:

18

No solo envíe una puntuación entera al servidor. Envíe una colección de estadísticas del juego que puedan usarse para verificar que el puntaje sea realista. O puede implementar alguna clave previamente compartida para calcular la puntuación. Puede enviar puntajes y estadísticas incrementales a lo largo del juego y asegurarse de que el aumento sea razonable.

Sin embargo, no me preocuparía demasiado por eso. Las sugerencias anteriores harán que sea más difícil, pero no imposible, enviar una puntuación falsa. Sin embargo, si lo haces un poco difícil, la gran mayoría de las personas que juegan tu juego no estarán interesadas en intentar engañarlo.

Ten cuidado con cómo permites que tu juego se comunique con tu servidor. No quieres que tu juego sea un punto de entrada a tu servidor para hackear. Asegúrese de validar siempre su entrada y nunca confíe en el cliente.

MichaelHouse
fuente
66
Ver programmers.stackexchange.com/questions/150127/... y gamedev.stackexchange.com/questions/37392/... al completo con el "Nunca confíes en el cliente"
dievardump
@ Byte56 ninguna forma de ofuscación o cifrado protegerá su código de un depurador que se utiliza para modificar los datos del juego durante el juego. Si el juego ocurre en el cliente, es esencialmente imposible evitar esta forma de trampa. Un navegador habilitado para Javascript no es un dispositivo informático confiable.
MarkR
10

Como dijo Byte56: "nunca confíes en el cliente", pero:

Nunca confiar en el cliente tiene un precio:
tener todos los juegos que se juegan en el servidor aumentará mucho el costo de su infraestructura.

Suponiendo que la mayoría de los jugadores no hagan trampa
y que la puntuación más alta se asiente después de un tiempo y deje de cambiar mucho

Hay un camino intermedio.

Grabar los juegos (en el cliente).
(Dependiendo del tipo de juego que podría ser súper fácil (por ejemplo, ajedrez) o un poco complicado (por ejemplo, un FPS multijugador),
pero siempre es factible).

Cuando un jugador termina un juego, simplemente envíe la puntuación.
Si el puntaje está dentro de un cierto rango en la parte superior (por ejemplo, el 1% superior o los 5 principales),
solicite los datos grabados del jugador
y reproduzca ese juego en el servidor.
Si los puntajes coinciden, acepte el puntaje.

De esta manera, no necesita recursos adicionales del lado del servidor para la mayoría de las jugadas,
pero puede garantizar que las puntuaciones más altas sean válidas.

Andreas
fuente
2
En otras palabras, a quién le importa si hacen trampa para otra cosa que no sean las mejores puntuaciones (¿por qué harían eso de todos modos?), Así que esos son los únicos que necesita validar.
jhocking
4

No te preocupes por eso; proteger de todos los ataques es esencialmente imposible si confía en el cliente. Si nadie usa Fiddler, etc., para modificar la solicitud de AJAX, simplemente puede iniciar un depurador JS y modificar los datos de su juego para darse 1000 vidas, etc., o modificar su código, o hacer otras 100 cosas que no ha pensado.

Escribí un juego así hace varios años, y que yo sepa, nadie hizo trampa de esta manera. No hubo premio, excepto tener su nombre en la tabla de puntajes.

MarkR
fuente
4

Reduzca la motivación social para hacer trampa, por ejemplo, usando tablas de clasificación sociales (hacer trampa solo lo hace ver bien para un puñado de amigos, no lo estropea para todos).

Verificar en el servidor. Joel Poloney tuvo una buena descripción de las técnicas en Game Developer 2012 Septiembre "Scale Your Online Game"

Vincent Scheib
fuente
2

Cuando quieras crear un juego en línea a prueba de trampas, debes manejar toda la lógica del juego en el servidor. Todo lo que sucede en el lado del cliente puede ser controlado y manipulado por el usuario. Existen técnicas como el cifrado o la ofuscación que puede probar, pero al final todo es solo seguridad a través de la oscuridad que puede ser eludida por alguien que esté suficientemente determinado.

Claro, un juego que se ejecuta en el servidor es mucho más complicado de desarrollar, requiere muchos más recursos del lado del servidor y la latencia de la red es perjudicial para la experiencia del juego (especialmente para los juegos de ritmo rápido), pero es la única manera efectiva evitar que los jugadores hagan trampa.

Philipp
fuente
Incluso eso no evitará todas las trampas, solo las cosas obvias de "sí, legítimamente obtuve un billón de puntos". Como algo tiene que ejecutarse en el cliente, terminan teniendo cierto control independientemente. Como mínimo, cualquier cliente, especialmente un navegador web, es programable.
cHao