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?
fuente
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.
fuente
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.
fuente
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.
fuente