Ahora que hay un par de prolijas demo de lona de plataformas clásicas e incluso juegos de fps 3D en HTML5, el siguiente paso podría ser intentar desarrollar un juego de HTML5 multijugador. El soporte de socket HTML5 hace que esto sea relativamente directo, pero con la fuente del lado del cliente visible en cualquiera de los navegadores, , cuáles son algunas de las soluciones para funciones de seguridad básica del juego para un juego multiusuario frontend HTML5 - , como poder prevenir un alto puntaje falso?HTML5 Multiplayer Game Security Solutions
Respuesta
La respuesta simple es: no se puede confiar en los datos del cliente, lo que significa que la alta puntuación enviada no puede provenir del cliente.
Dado que el cliente de código está disponible para que cualquiera pueda inspeccionarlo, no hay forma de confiar en los datos que el cliente envía a su servidor. Incluso si encriptas los datos con una clave de encriptación por usuario (que es posible), el usuario puede simplemente modificar tu código dentro del navegador y cambiar los valores que envía al servidor.
Dado que su juego es multijugador, esto podría ser posible SI el servidor genera todos los eventos de puntuación. Si el servidor genera todos los eventos de puntuación, el cliente nunca envía datos de puntaje al servidor, lo que significa que los datos de puntaje alto no pueden ser falsificados.
Usted todavía tiene que lidiar con el engaño, lo que es aún más difícil, pero eso es otro tema ...
Añadiendo a lo que dijo Larry, definitivamente va a tener que manejar el marcador en el el backend para evitar realmente la publicación de trampas/puntaje falso.
Para tener un ejemplo de esto en la práctica ... El juego Word Wars es un juego al estilo boggle donde puedes encontrar tantas palabras como puedas de una cuadrícula de letras 4x4.
Al comienzo de cada juego, se genera una tabla 4x4 del lado del servidor. Se genera una lista de posibles palabras para esa placa y se pasa al cliente una versión hash (md5'd con una sal aleatoria) de cada palabra, así como la sal.
En el lado del cliente, cuando se escriben las letras y se presiona la tecla enter, md5 (con la sal del servidor) la palabra que se ingresó y se compara con la lista de palabras hash provistas por el servidor. Si es una coincidencia, actualizamos al cliente con la nueva puntuación (hay una función basada en las letras utilizadas y sus valores de puntos).
Una vez que el juego termina, el cliente envía la lista de palabras que se le ocurrió al servidor (NO el puntaje), y el servidor verifica que esas palabras existían en el tablero y maneja la puntuación.
Aquí es donde entra Clay.io, la empresa en la que trabajo. Clay.io ofrece una API para funciones de juegos HTML5 de alto nivel, como tablas de clasificación, logros, procesamiento de pagos, etc. No hace falta decir que necesitaba una solución para juegos que tienen un back-end para hacer que ciertas cosas, como puntajes altos, sean más seguras.
La solución fue cifrar objetos de JavaScript en el back-end (node.js, php, lo que sea) usando JWT (JSON Web Token), y pasar ese objeto cifrado en lugar de la puntuación en sí. Esto nos permite comunicarnos en ambos sentidos (juego -> Clay.io y Clay.io -> juego), y es bastante fácil de hacer. Los documentos completos en esto son aquí: clay.io/docs/encryption (enlaces max golpeado en esta respuesta)
Volver a Word Wars ... desde el servidor que generamos JWT con la puntuación del usuario y que pase a Clay.io para publicar el puntaje.Voila :)
Por supuesto, esto será diferente según el tipo de juego que está en desarrollo es diferente, pero la moraleja de la historia es que hay que ser creativo :)
me ha escrito una entrada de blog que cubre HTML5 seguridad del juego en mayor detalle. Part 3 of a series on HTML5 Game Development Tips.
A menos que malinterprete, parece muy fácil para un tramposo hacer un ataque de diccionario en contra de la lista de palabras cifradas. No es tan fácil como echar un vistazo a una lista sin encriptar, pero cerrar. (Aunque supongo que el tramposo también podría construir un solucionador de boggle si eso no funcionara). –
Sí, podrían lanzar todas las palabras del diccionario en el juego y llegar a alguna parte ... por supuesto, podrías consultar fallar las tasas para ver si alguien realmente está haciendo eso. La única persona que lo 'crackeó' acabó creando un solucionador de boggle: desafortunadamente, no hay forma de evitarlo (al igual que no hay forma de que Words With Friends evite ese tipo de cosas en un equivalente de Scrabble) – austinhallock
- 1. HTML5 localStorage security
- 2. Caching Solutions
- 3. Rails Search Plugins & Solutions
- 4. ¿Visual Studio 2010 Professional Solutions/Projects es 100% compatible con Visual Studio 2010 Premium Solutions/Projects?
- 5. Game Architecture
- 6. XNA game tutorial
- 7. iOS Game Engine
- 8. .NET Game Server
- 9. Game Center InviteFailed
- 10. Estrategia Game Server Concept
- 11. Java 3D Game Engine?
- 12. Android Multitouch Game
- 13. OOP Game Design Theory
- 14. Diseño de Game Objects
- 15. Game Center Formatting Time
- 16. Android Game Framework
- 17. JavaScript game framework
- 18. Game UI HUD
- 19. Asp.NET Real Time Game
- 20. Game Oriented Assembler Lisp
- 21. Game Programming Library C++
- 22. Java Game Engine
- 23. C# Game Network Library
- 24. iOS Game Center Group
- 25. TDD And Game Physics
- 26. XNA 2D Game Engines
- 27. XNA game performance
- 28. Video Game Bots?
- 29. node.js game server framework?
- 30. Comenzando en Game Development
Todavía estoy pensando en maneras en que el servidor que genera los eventos de puntuación podría funcionar ... Parece que, inevitablemente, el cliente habría iniciado algunos comentarios para que el juego sea interactivo, como hacer clic o presionar un botón, lo que haría finalmente se traducirá a solo una llamada de socket/URL, suponiendo que cada proceso de puntuación se envía al servidor. Dado que la URL para enviar este evento de puntuación está abierta (¿y no hay manera de evitar esto?), Parece que las personas pueden fácilmente abusar de ella configurando un raspador en la URL, incluso. ¿Qué tipo de juego podría tener solo eventos de puntuación limitados por el servidor? – ina
@ina: casi todos los juegos comerciales en línea hacen toda su puntuación en el servidor. El cliente inicia las acciones pero el servidor las resuelve y decide el resultado. – Kylotan
@ina: Lo que dijo kylotan. No tenga un evento de "generar una puntuación". Haga que un evento de "jugador tomó esta acción". Si la acción genera un puntaje generado, genere el puntaje en el servidor. Significa que su cliente no es más que una pantalla para eventos generados por el servidor; efectivamente no hay elementos de juego ejecutados en el cliente, todos ocurren en el servidor y se procesan en el cliente. –