Evite la actualización no autorizada de la tabla de clasificación en línea php / sql [duplicado]

5

Estoy desarrollando una aplicación web (juego) fuera de línea para android usando cordova (phonegap). La tabla de clasificación de la misma se mantiene en línea en mi servidor.

Actualmente, así es como se actualiza la tabla de clasificación

Paso 1) La puntuación del usuario se almacena en el almacenamiento local de la aplicación sin conexión.

Paso 2) El usuario presiona el botón "actualizar mi puntuación" que se conecta a Internet.

Paso 3) El botón básicamente envía una solicitud ajax a enlace

Paso 4) En base a esto, la base de datos se actualiza en mi servidor mediante el archivo scoreupdate.php y devuelve el éxito.

Estos son los problemas a los que me enfrento

1) Cualquiera puede visitar enlace fácilmente si conocen el ID de usuario (puede ser fácilmente obtenido de los datos de almacenamiento local de la aplicación) y él / ella puede actualizar su puntuación en la tabla de clasificación simplemente reemplazando el valor obtenido con puntaje para obtener una mejor posición en la tabla de clasificación.

2) Cualquier valor secreto almacenado en la aplicación o localstorage puede obtenerse fácilmente ya que todo está incorporado en javascript. La ingeniería inversa de la aplicación también es posible, por lo que no pude encontrar una manera de autenticar de manera eficiente que es la aplicación real la que envía la solicitud al servidor y no a una persona.

Mis requisitos

1) La aplicación debe poder autenticar el archivo scoreupdate.php que es la aplicación real y no una persona. Para que solo la aplicación pueda actualizar la tabla de clasificación.

2) El usuario no debe descifrar la lógica de la autenticación simplemente leyendo el código fuente de la aplicación. (p. ej., multiplicar el ID de usuario con algunos números y hacer el proceso inverso en el servidor no funcionará)

¿Hay alguna manera de lograr esto?

El cifrado de Javascript no es efectivo, ya que se puede descomponer fácilmente

EDIT

No estoy preocupado si alguien roba las credenciales del usuario a través de un MITM o cualquier otro ataque de fuerza bruta. Incluso el usuario real que posee el perfil no debería poder actualizar su propia puntuación.

    
pregunta Sandeep Thedarkprince C 31.12.2015 - 19:09
fuente

5 respuestas

7

No estoy de acuerdo con que sea imposible.

Dependiendo de la forma de su juego, podría ser posible aplicar el siguiente esquema:

  1. Durante el juego, registra el estado inicial, incluidas las semillas a los RNG y todas las entradas del usuario.
  2. Al enviar el juego, envíe esta "repetición" de la sesión al servidor junto con la puntuación reclamada.
  3. En el servidor, ejecute la lógica del juego con la entrada provista y vea si el resultado es el mismo. Si lo hace, la repetición es válida y usted actualiza la puntuación.

De esta manera, has transformado efectivamente el problema de hacer trampa al problema de escribir un bot o un solucionador para tu juego, que es lo mejor que puedes obtener en una situación como esta.

Básicamente, esta es una muy buena solución para cualquier juego que se pueda ver como un problema NP-completo donde verificar una solución es fácil desde el punto de vista computacional, mientras que encontrarlo es difícil. Un ejemplo es Sokoban.

    
respondido por el Zeta Two 01.01.2016 - 00:40
fuente
6

No, esto es imposible.

Confía en el cliente para proporcionar datos precisos. Pero no puedes hacer eso, porque el cliente está fuera de tu control. Se ejecuta en el hardware de los usuarios, lo que significa que el usuario puede cambiarlo de la forma que desee y no hay nada que pueda hacer al respecto. Cualquier intento de autenticar que el cliente no se modificó también debe ejecutarse en la máquina cliente, lo que significa que tampoco está protegido contra la manipulación.

La única forma de evitar que los jugadores hagan trampas es ejecutando todas las mecánicas del juego en tu propio servidor.

    
respondido por el Philipp 31.12.2015 - 20:46
fuente
3

Con una aplicación fuera de línea esto no se puede lograr porque lo obliga a confiar en la aplicación (que se puede modificar) para almacenar y actualizar la puntuación. No hay forma de evitar esto para una aplicación sin conexión.

Incluso con un cifrado totalmente homomórfico, la aplicación fuera de línea podría manipular los datos incluso si no puede ver los datos originales.

Si la aplicación del cliente es responsable del mantenimiento de la puntuación, solo puede esperar honestidad y frustrar los intentos de engaño a través de la ofuscación; no puedes realmente prevenirlos.

Una posible solución incompleta que puede abordar una gran proporción de trampas es usar redes bayesianas sintonizadas para realizar la detección de fraudes. Evalúa los cambios en la actividad del juego y puntúa los cambios en niveles bajos, medios y altos y luego utiliza una red bayesiana para fusionar los resultados en una única puntuación de riesgo. Eso es bastante sofisticado y está lejos de ser infalible, pero puede ser una opción si la aplicación debe estar fuera de línea.

Si puede convertirla en una aplicación en línea, puede mover la administración de reglas y la puntuación al servidor que está bajo su control, donde puede evitar las trampas. Incluso entonces es un proceso difícil si el cliente puede enviar algo más que los eventos de entrada del usuario.

    
respondido por el Alain O'Dea 31.12.2015 - 21:04
fuente
1

Lo siento, no puedo hacer.

En general, si sus requisitos son:

  1. Tener un cliente fuera de línea.
  2. Haga que el código del cliente sea de código abierto o fácilmente descompilable.
  3. Evita que el cliente haga trampas.

Luego, elige cualquiera de esos .

Nota: incluso si decides cambiar # 2 e ir con código compilado que no es fácil de descompilar, todavía estás a merced de la seguridad por la oscuridad. Puedes codificar las claves de cifrado y esperar que nadie lo descubra, y si tu juego es solo por diversión, puede ser lo suficientemente bueno , pero si hay dinero involucrado, puede que no lo sea.

La mejor opción de los 3 a cambiar es no tener un cliente sin conexión.

Advertencia: anteriormente dije "en general" porque hay tipos específicos de juegos en los que puedes cumplir los 3 requisitos, por ejemplo, juegos que son intrínsecamente difíciles para resolver (por ejemplo, imagina un tipo de cubo de Rubik juego donde la solución aún no es ampliamente conocida). Consulte la respuesta de Zeta Two para obtener más información sobre este tipo de preguntas.

    
respondido por el TTT 31.12.2015 - 20:53
fuente
0

La única forma real de resolver esto es con hardware personalizado donde las claves criptográficas y el código fuente están incrustados en un dispositivo de una manera que es muy difícil de extraer o modificar para los usuarios normales.

Por ejemplo, podría tener un sistema de videojuegos en el que lea juegos en DVD cifrados. El sistema de videojuegos (que ejecuta el código fuente secreto existente en la memoria de solo lectura del sistema) puede descifrar el videojuego (usando una clave secreta incrustada en el dispositivo) y verificar que provenga de una fuente legítima y que no haya sido modificado. Dentro del código fuente del juego de video (que su sistema verificado no se modificó y no se puede filtrar), puede incluir una clave privada que se utiliza para firmar digitalmente combinaciones de nombre de usuario y puntajes altos al enviar puntajes a la tabla de clasificación en línea. / p>

Sin embargo, una vez que permita que los usuarios vean y modifiquen el código fuente, perderá (ya que el usuario solo puede modificar la fuente para cambiar la puntuación más alta a cualquier valor justo antes de la hora en que se envía normalmente), a menos que hay una manera para que el usuario también envíe sus movimientos y haga que el servidor verifique que esos movimientos se correspondan con la puntuación.

Por ejemplo, si el juego involucra resolver rompecabezas en X movimientos o menos, y desea enviar que resolvió el N-ésimo rompecabezas, puede hacer que su juego envíe la serie de movimientos que realizó, y luego su servidor puede compruebe que esos movimientos consisten en una solución que resuelva el N-ésimo rompecabezas en X movimientos o menos y que se envió a la hora indicada por el reloj del servidor.

    
respondido por el dr jimbob 31.12.2015 - 21:33
fuente