Asegurar datos HTTP de un juego de JavaScript al servidor

8

Supongamos que estoy haciendo un juego de JavaScript, y deseo que el juego actualice el servidor si el usuario ha completado con éxito el juego y su resultado.

¿Cómo debo asegurarme de que la solicitud provenga del juego de JavaScript y que los datos enviados no hayan sido alterados? Estoy usando PHP como el lenguaje del lado del servidor.

Entiendo que ninguna estrategia será 100% infalible, y cualquier medida tomada es más un elemento de disuasión que una protección absoluta.

En Editar: supongamos que no estamos utilizando la verificación del servidor de los pasos de cada usuario (como en un MMO tradicional). El juego podría ser un minijuego como parte de un juego web o un juego educativo (invasores del espacio o un juego en tiempo real, por ejemplo) y requerir un componente del lado del servidor para cada uno de esos juegos podría ser tedioso.

Ejemplo: supuestamente, cuando se completa el juego, se envía una solicitud al servidor a través de. AJAX

game_finished.php?user_id=1&outcome=success&score=88

Un usuario podría "falsificar" el servidor al creer que el juego se ha completado correctamente enviando esa solicitud a game_finished.php. ¿Cómo podría hacerse esto más difícil?

Extrakun
fuente

Respuestas:

10

un rompecabezas de bloques deslizantes, por ejemplo

Este es un ejemplo donde la verificación del lado del servidor es trivial. No es necesario verificar cada paso hasta que termine el juego. Simplemente envíe la lista de movimientos completa y el servidor la reproducirá para asegurarse de que sea correcta.

(Editar: El objetivo de esta respuesta no es elegir ejemplos hasta que encuentre uno que no sea trivialmente validable. Por el contrario, debería hacer que regrese y mire el juego que realmente está haciendo; probablemente sea trivialmente validable, o solo necesita un pequeño ajuste para ser.)


fuente
Estaba pensando en el ejemplo y no es el mejor de los ejemplos. Digamos Space Invaders entonces. Actualizaré la pregunta.
Extrakun
2
Sin embargo, el movimiento de Space Invaders también es totalmente determinista. Solo necesita registrar cuándo ocurre cada par de disparo / golpe, simular el movimiento hasta ese momento (que es una ecuación lineal simple) y asegurarse de que en realidad fue un golpe.
Finalmente entendí lo que quieres decir después de pensarlo bien. Gracias
Extrakun
Solo una adición al aspecto "totalmente determinista": si necesitas aleatoriedad en tu juego, pasa una semilla específica para esa aleatoriedad al cliente y guarda esa semilla en el servidor. Cuando el cliente envía el registro de juego para confirmación, el servidor también puede reproducir las partes que involucran aleatoriedad. Lo mismo es posible para los pasos que dependen de la hora local. Vea los algoritmos de guardar y cargar de Undum ( undum.com ) como un ejemplo de cómo se puede hacer esto en JavaScript.
BerndBrot
2

Puedes hacerlo a la manera de Warcraft: usa Javascript solo para enviar comandos de movimiento al servidor y deja que el servidor maneje la lógica.

Esto aún te deja abierto a los robots (programas javascript que mueven las cosas más rápido y con mayor precisión que lo humanamente posible), pero eso es un gran paso en comparación con dejar la puerta abierta al truco /game_finished.php.

egarcia
fuente
1

Si está haciendo que el cliente calcule la puntuación, no hay forma de validarla más allá (como se indicó) haciendo que el servidor vuelva a jugar el juego para confirmar que obtiene la misma puntuación.

Sin embargo, hay tipos de juegos que puedes diseñar que no funcionan en función de solo una puntuación numérica. Un script del lado del servidor puede generar un problema matemático de suma aleatoria, por ejemplo, y cuando el usuario envía la respuesta, puede comparar su respuesta con la correcta y calificarla del lado del servidor.

Pero si su juego es complejo (como el ejemplo de los invasores del espacio), no hay mucho que pueda hacer al respecto más allá de a) confiar en el cliente ob) permitir que el servidor administre el juego.

Tim Holt
fuente
-1

Hay muchos métodos, pero todos fallarán eventualmente. Puede agregar algún valor hash o una clave de consulta renovada con cada consulta.

Pero lo más importante es que todas sus funciones de súper codificación se envían como códigos fuente al navegador de los clientes y ese es EL problema. Para hacerlo un poco más difícil, puede usar la función de envío por consulta Ajax, por lo que las fuentes no estarán disponibles bajo una URL. La función debe enviarse comprimida, y tal vez incluso en partes, por lo que será más difícil copiarlo todo. También verificaría este código en una página como http://jsbeautifier.org/ si después de hacerlo legible su código es fácil de entender.

Pensador
fuente