2010-03-30 14 views
8

Estoy trabajando en juegos usando javascript algunos html y css, y me preguntaba si había alguna manera de asegurar el juego para que el usuario no pueda simplemente llamar a game.php? Result = victory para terminar el juego y ganar algún punto.¿Cómo hacer un juego seguro en javascript?

A partir de ahora aquí están la solución que tengo.

  • Para un juego de azar, iniciar la página con el resultado ya en el lugar, ganar o suelto, a continuación, sólo lo hacen algunos animaciones de mostrarlo, pero todos la puntuación y ganar/material suelto se hace en el lado del servidor.

  • Para un juego de batalla, acaba de obtener la acción de la llamada de Javascript, y hacer el cálculo de daño, la reacción del oponente en el servidor y solo devolver los datos.

pero la última solución implica que tendré que enviar acciones cada vez que el usuario haga algo. Esto podría funcionar para un juego de batalla por turno, pero creo que sería más lento para cualquier otro tipo de juego. Así que mi pregunta es, ¿hay alguna forma segura de que pueda preparar mi javascript para asegurar la información enviada?

Respuesta

13

La única forma de asegurarlo es teniendo todo el cálculo y la validación en el lado del servidor. Así es como se hace en casi todos los juegos en línea. El cliente nunca puede confiar en la comunicación en línea y siempre debe asegurarse de que el usuario realmente esté haciendo algo válido en el servidor. (En teoría, de todos modos, en la práctica hay que confiar en el cliente un poco por la compensación de retraso y descargar algunas cosas no críticas al lado del cliente).

Por esta razón, javascript no es un lenguaje muy bueno para desarrollar un juego en línea, ya que cada acción necesita ser procesada y validada por el servidor. Para otros lenguajes de programación no es un problema tan grande, porque puede construir sus propios protocolos de comunicación utilizando TCP/IP para el servidor y el cliente. Sin embargo, para javascript no existe tal posibilidad, ya que debe confiar en el protocolo HTTP y en los manejadores XMLHTTPRequest, que hacen que la comunicación entre el servidor y el servidor sea muy ineficaz.

Como usted dijo, siempre puede hacer la interfaz en javascript, pero por seguridad, aún necesita realizar muchas cosas del lado del servidor y esto ciertamente no funciona para juegos que requieren más control orientado a la acción.Entonces, estás bastante limitado a los juegos basados ​​en turnos, si necesitas la seguridad.

+0

gracias por la respuesta completa :) Supongo que me quedaré con los juegos de turno y oportunidad entonces. – rnaud

1

No, no hay manera.
¿Qué hay de malo en enviar acciones de usuario al servidor?

+1

Bueno i' Estoy pensando en conexiones móviles y conexiones bajas, me gustaría evitar cargar cosas cada medio segundo. – rnaud

2

Podría hacer algunas cosas para frustrar al usuario ingenuo, pero probablemente no a todo el mundo. Todo depende de qué tan motivada esté la persona para "atacar" tu juego. Al final del día, el usuario podría usar un depurador de JavaScript para ver exactamente qué está haciendo su código y replicarlo. Incluso si devuelve cada acción del juego, el usuario aún podría replicar eso. Si no tiene cuidado con las acciones que puede realizar el usuario, es posible que pueda devolver acciones que serían imposibles si estuviera controlando el juego con el esquema de control predeterminado.

2

No debe haber una URL para la victoria. Durante el juego, el cliente debe enviar las acciones del usuario y, si ganó, el servidor lo redirecciona a la página de la victoria.

No se debe hacer ningún cálculo/recompensa en la página de la victoria, si corresponde.

1

¿Sería esto una opción? (Respuesta tardía)

Transfiere el elemento crítico (material que no quieres ser pirateado) a un reproductor flash interno oculto, que actúa como almacenamiento de variables críticas, calculadora (por ejemplo: puntos de vida) y "comunicador" al servidor para tales datos del juego.

Definitivamente es más seguro que JavaScript. Pero aún; Siempre es mejor suponer que su lado del cliente es 100% no seguro. (Incluso en los juegos de C++, lol: hackers)

Sin embargo, mediante la transferencia del tráfico de datos del juego a flash, que son capaces de utilizar algunas de sus funciones de comunicación más interesantes, por ejemplo: P2P =)

+0

Esta es una opción muy interesante en la que nunca pensé. Realmente no tengo mucho conocimiento AS, pero ¿cómo funcionaría esto? –

+1

@Angelo R. El enlace contiene más detalles sobre cómo enlazar AS3 con JS: http://www.hardcode.nl/archives_155/article_334-call-javascript-function-from-as3-and-viceversa. Para abreviar, ambos lados pueden ejecutar llamadas de función entre sí. Al forzar, el tráfico de datos importantes se ejecuta a través de flash y, por lo tanto, el servidor. Puede convertir el flash en un almacenamiento variable 'seguro' que se sincroniza con el servidor, con javascript como 'visualización de datos'. Sin embargo: tenga en cuenta que el flash no es 100% infalible, pero sin duda es mucho más difícil de descompilar en comparación con Javascript. – PicoCreator

+0

Gracias por esto, va a ser una lectura interesante ... y posiblemente proyecto –

Cuestiones relacionadas