Seamos más específicos acerca de tu ejemplo y digamos que este es un juego de póquer en línea. El servidor contiene datos que representan el centro de la mesa (incluido el bote, el mazo boca abajo y la "comunidad" de cartas), pero el software del cliente controla su "esquina" de la mesa (el alijo del jugador, su mano, y sus decisiones).
La suposición es que el software cliente es el mismo software lanzado por el autor del juego, sin modificaciones de ningún tipo, por lo que el software cliente se ha hecho responsable de realizar un seguimiento preciso de sus fondos y de sus manos; el servidor "reparte" las tarjetas al cliente, y tal como lo haría el verdadero crupier del casino, "olvida" (o nunca sabe) qué tarjeta se repartió.
Esto no es una suposición segura; alguien que pueda manipular el programa cliente, o incluso solo los mensajes que se envían desde y hacia él, puede elegir su mano modificando los mensajes sobre las tarjetas que el servidor ha enviado y puede multiplicar sus ganancias reales (o incluso ignorar las pérdidas girando) "pierdes" en "ganas $ 1000").
La solución no es permitir que el software cliente tenga nada que se aproxime a este nivel de control. El modelo a seguir es el de un "terminal tonto"; trate el software cliente como nada más que un cable largo realmente que conecta su teclado y monitor a la computadora del servidor. El cliente no sabe nada más que lo que dice el servidor, y no hace nada más que transmitir la entrada del usuario al servidor y viceversa. No tiene una "lógica de negocios" propia, solo muestra el juego al usuario.
Dado este modelo, la manipulación de las comunicaciones no es buena para el atacante; Las comunicaciones desde el servidor y los números y tarjetas en la pantalla se pueden cambiar al contenido del corazón del atacante, pero cualquier acción basada en los datos incorrectos del cliente se hace realidad con un ruido sordo por parte del servidor. El cliente no puede decir "Yo levanto 50 mil"; el servidor simplemente responderá "solo tienes $ 20 en tu pila; inténtalo de nuevo". El cliente no puede decir "Soy Bob y llamo"; El servidor, al ver que la solicitud llegó a una sesión segura que pertenece a Bill, dirá "No, eres Bill, siéntate y cállate hasta que Bob haya tomado su turno". Incluso los ataques de repetición, donde un cliente puede escuchar la conversación segura entre otro cliente y el servidor, y repetir la comunicación para ejecutar cualquier comando contenido en ella, se detectan e ignoran muy fácilmente. Dada la suficiente cantidad de estas comunicaciones descabelladas, el servidor puede decir "Me estás perdiendo el tiempo, adiós" y expulsar al cliente del juego.
La desventaja, como se mencionó, es la latencia. La estrategia en el ideal funciona para un juego de póquer, donde todos actúan por turnos y, por lo tanto, hay mucha espera de todos modos, y es trivial que el servidor realice un seguimiento de todo lo que sucede a la vez. No funciona tan bien para un FPS o RTS, donde la interacción entre todos los jugadores debe ser en tiempo real o muy cerca, y hay un lote de cálculo de proyectiles y cuerpos que se mueven, vuelan, chocan, etc. Causa problemas cuando la latencia es de más de unos pocos milisegundos (independientemente de la velocidad de datos); si todos tienen un ping de 150 ms a un servidor de juegos, entonces todos están viendo dónde estaban todos los demás hace 300 ms (al menos) y si alguien aprieta el gatillo cuando la cabeza de un oponente está en la mira, el servidor cree que estás disparando a donde la persona estaba en realidad hace medio segundo y dice "te lo perdiste". Eso requiere que los jugadores se "atrasen", disparando frente a sus objetivos por una distancia basada en su latencia combinada, incluso cuando la física del juego dicta que el viaje de bala es instantáneo.
Para compensar esto, el servidor necesariamente cede algo de control y permite que los clientes digan "Le disparé a Bob en la cabeza" cuando el jugador aprieta el gatillo mientras la cabeza de Bob aparece en su punto de mira en la pantalla. Sin embargo, un jugador con un mod de juego que puede "ignorar" estratégicamente los datos entrantes sobre las posiciones de otros jugadores puede manipular esta cantidad de confianza del cliente para realizar el truco de "congelar el cuadro"; desactiva los datagramas entrantes, y todos los demás se congelan en su lugar, lo que permite al atacante un buen disparo en la cabeza. Si el servidor cree la reclamación del cliente, porque nadie más afirma que le disparó primero a ese tipo, el otro hombre está muerto, incluso si su propio cliente lo muestra a salvo fuera de la línea de fuego.
Para este tipo de cosas, realmente no hay mejor respuesta; En cualquier lugar que coloque el control sobre la toma de decisiones de tipo "árbitro" que cambian el juego, los jugadores acusarán a otros de hacer trampa porque vaciaron un clip en el tipo que estaba en el punto en blanco y el servidor dice que tienen éxito, o porque el servidor dijo " Bill está muerto, Bob le disparó "dos segundos completos después de que Bill pensara que había despejado la línea de fuego de Bob detrás de un obstáculo.