Este es un problema clásico con los juegos y concursos de Internet. Su código Flash funciona con los usuarios para decidir una puntuación para un juego. Pero los usuarios no son de confianza, y el código Flash se ejecuta en la computadora del usuario. Eres SOL No hay nada que puedas hacer para evitar que un atacante forje puntuaciones altas:
Flash es aún más fácil de realizar ingeniería inversa de lo que podría pensar, ya que los códigos de bytes están bien documentados y describen un lenguaje de alto nivel (Actionscript) --- cuando publica un juego Flash, está publicando su código fuente, ya sea que Lo se o no.
Los atacantes controlan la memoria de tiempo de ejecución del intérprete de Flash, de modo que cualquiera que sepa cómo usar un depurador programable puede alterar cualquier variable (incluida la puntuación actual) en cualquier momento, o alterar el programa en sí.
El ataque más simple posible contra su sistema es ejecutar el tráfico HTTP para el juego a través de un proxy, capturar el puntaje más alto guardado y reproducirlo con un puntaje más alto.
Puede intentar bloquear este ataque vinculando cada puntaje alto guardado a una sola instancia del juego, por ejemplo, enviando un token cifrado al cliente al inicio del juego, que podría verse así:
hex-encoding( AES(secret-key-stored-only-on-server, timestamp, user-id, random-number))
(También puede usar una cookie de sesión para el mismo efecto).
El código del juego devuelve este token al servidor con el guardado de puntaje alto. Pero un atacante aún puede iniciar el juego nuevamente, obtener una ficha y luego pegarla inmediatamente en una partida guardada de puntaje repetido.
Entonces, a continuación, alimenta no solo un token o una cookie de sesión, sino también una clave de sesión de cifrado de alta puntuación. Esta será una clave AES de 128 bits, encriptada con una clave codificada en el juego Flash:
hex-encoding( AES(key-hardcoded-in-flash-game, random-128-bit-key))
Ahora, antes de que el juego publique la puntuación más alta, descifra la clave de sesión de cifrado de alta puntuación, lo que puede hacer porque codificó la clave de sesión de clave de cifrado de alta puntuación en el binario Flash. Cifras la puntuación más alta con esta clave descifrada, junto con el hash SHA1 de la puntuación más alta:
hex-encoding( AES(random-128-bit-key-from-above, high-score, SHA1(high-score)))
El código PHP en el servidor verifica el token para asegurarse de que la solicitud provenga de una instancia de juego válida, luego descifra el puntaje alto encriptado, verificando que el puntaje alto coincida con el SHA1 del puntaje alto (si omite este paso , el descifrado simplemente producirá puntajes aleatorios, probablemente muy altos, altos).
Entonces, el atacante descompila su código Flash y rápidamente encuentra el código AES, que sobresale como un pulgar dolorido, aunque incluso si no fuera así, sería rastreado en 15 minutos con una búsqueda de memoria y un rastreador ("Lo sé mi puntaje para este juego es 666, así que busquemos 666 en la memoria, luego capturemos cualquier operación que toque ese valor --- ¡mira, el código de cifrado de puntaje alto! "). Con la clave de sesión, el atacante ni siquiera tiene que ejecutar el código Flash; ella toma una ficha de inicio del juego y una clave de sesión y puede enviar una puntuación alta arbitraria.
Ahora estás en el punto en que la mayoría de los desarrolladores simplemente se dan por vencidos --- da o toma un par de meses jugando con los atacantes al:
Encriptando las teclas AES con operaciones XOR
Reemplazar matrices de bytes de clave con funciones que calculan la clave
Dispersión de cifrados de claves falsas y publicaciones de alta puntuación en todo el binario.
Todo esto es principalmente una pérdida de tiempo. No hace falta decir que SSL tampoco te ayudará; SSL no puede protegerlo cuando uno de los dos puntos finales SSL es malo.
Aquí hay algunas cosas que realmente pueden reducir el fraude de puntaje alto:
Solicite un inicio de sesión para jugar, haga que el inicio de sesión produzca una cookie de sesión y no permita múltiples lanzamientos de juegos pendientes en la misma sesión o múltiples sesiones simultáneas para el mismo usuario.
Rechace las puntuaciones altas de las sesiones de juego que duran menos que los juegos reales más cortos jamás jugados (para un enfoque más sofisticado, intente "poner en cuarentena" las puntuaciones altas para las sesiones de juego que duran menos de 2 desviaciones estándar por debajo de la duración media del juego). Asegúrate de estar rastreando las duraciones del juego en el servidor.
Rechace o ponga en cuarentena los puntajes más altos de los inicios de sesión que solo han jugado el juego una o dos veces, de modo que los atacantes tengan que producir un "rastro de papel" de juego de aspecto razonable para cada inicio de sesión que creen.
"Heartbeat" puntúa durante el juego, para que su servidor vea el aumento de la puntuación durante la vida de un juego. Rechazar puntajes altos que no siguen curvas de puntaje razonables (por ejemplo, saltar de 0 a 999999).
Estado del juego "Instantánea" durante el juego (por ejemplo, cantidad de municiones, posición en el nivel, etc.), que luego puede conciliar con los puntajes provisionales registrados. Ni siquiera tiene que tener una forma de detectar anomalías en estos datos para comenzar; solo tienes que recogerlo, y luego puedes volver y analizarlo si las cosas se ven sospechosas.
Inhabilite la cuenta de cualquier usuario que falle en una de sus comprobaciones de seguridad (por ejemplo, al enviar una puntuación alta encriptada que falla la validación).
Sin embargo, recuerde que aquí solo está disuadiendo el fraude de alta puntuación. No hay nada que puedas hacer para evitarlo. Si hay dinero en juego en tu juego, alguien derrotará cualquier sistema que se te ocurra. El objetivo no es detener este ataque; es hacer que el ataque sea más costoso que simplemente ser realmente bueno en el juego y vencerlo.