Este é um problema clássico com jogos e concursos na Internet. Seu código Flash trabalha com os usuários para decidir uma pontuação para um jogo. Mas os usuários não são confiáveis e o código Flash é executado no computador do usuário. Você é SOL. Não há nada que você possa fazer para impedir que um invasor forje pontuações mais altas:
O Flash é ainda mais fácil de fazer engenharia reversa do que você imagina, pois os bytecodes estão bem documentados e descrevem uma linguagem de alto nível (Actionscript) --- quando você publica um jogo em Flash, publica seu código-fonte, independentemente de conheça ou não.
Os invasores controlam a memória de tempo de execução do interpretador Flash, para que qualquer pessoa que saiba usar um depurador programável possa alterar qualquer variável (incluindo a pontuação atual) a qualquer momento ou o próprio programa.
O ataque mais simples possível contra o seu sistema é executar o tráfego HTTP do jogo por meio de um proxy, capturar a pontuação mais alta e reproduzi-la com uma pontuação mais alta.
Você pode tentar bloquear esse ataque vinculando cada save de alta pontuação a uma única instância do jogo, por exemplo, enviando um token criptografado para o cliente na inicialização do jogo, que pode parecer:
hex-encoding( AES(secret-key-stored-only-on-server, timestamp, user-id, random-number))
(Você também pode usar um cookie de sessão para o mesmo efeito).
O código do jogo faz com que esse token retorne ao servidor com o salvamento de maior pontuação. Mas um invasor ainda pode simplesmente iniciar o jogo novamente, obter um token e colá-lo imediatamente em um save repetido de pontuação alta.
Então, em seguida, você alimenta não apenas um token ou cookie de sessão, mas também uma chave de sessão com criptografia de alta pontuação. Essa será uma chave AES de 128 bits, ela própria criptografada com uma chave codificada no jogo Flash:
hex-encoding( AES(key-hardcoded-in-flash-game, random-128-bit-key))
Agora, antes que o jogo publique a pontuação mais alta, ele descriptografa a chave da sessão de criptografia de alta pontuação, o que pode ser feita porque você codificou a chave de decriptografia da chave de sessão de criptografia de alta pontuação no binário do Flash. Você criptografa a pontuação mais alta com essa chave descriptografada, juntamente com o hash SHA1 da pontuação mais alta:
hex-encoding( AES(random-128-bit-key-from-above, high-score, SHA1(high-score)))
O código PHP no servidor verifica o token para garantir que a solicitação veio de uma instância de jogo válida e descriptografa a pontuação máxima criptografada, verificando se a pontuação máxima corresponde ao SHA1 da pontuação máxima (se você pular esta etapa , a descriptografia simplesmente produzirá pontuações aleatórias, provavelmente muito altas e altas).
Portanto, agora o invasor descompila seu código Flash e encontra rapidamente o código AES, que se destaca como um polegar dolorido, embora, mesmo se não fosse, seria rastreado em 15 minutos com uma pesquisa de memória e um rastreador ("Eu sei minha pontuação neste jogo é 666, então vamos encontrar 666 na memória e capturar qualquer operação que toque nesse valor --- olha, o código de criptografia de alta pontuação! "). Com a chave da sessão, o invasor nem precisa executar o código Flash; ela pega um token de lançamento do jogo e uma chave de sessão e pode enviar de volta uma pontuação alta arbitrária.
Agora você está no ponto em que a maioria dos desenvolvedores simplesmente desiste - ou aproveite alguns meses para mexer com os invasores:
Embaralhar as teclas AES com operações XOR
Substituindo matrizes de bytes de chave por funções que calculam a chave
Espalhando criptografias de chaves falsas e postagens de alta pontuação em todo o binário.
Isso tudo é principalmente uma perda de tempo. Escusado será dizer que o SSL também não irá ajudá-lo; O SSL não pode protegê-lo quando um dos dois pontos de extremidade SSL é ruim.
Aqui estão algumas coisas que podem realmente reduzir a fraude de pontuação alta:
Exija um login para jogar, faça com que ele produza um cookie de sessão e não permita vários lançamentos pendentes de jogos na mesma sessão, nem várias sessões simultâneas para o mesmo usuário.
Rejeite pontuações altas de sessões de jogos que duram menos que os jogos reais mais curtos já realizados (para uma abordagem mais sofisticada, tente "colocar em quarentena" altas pontuações para sessões de jogos que durem menos de 2 desvios padrão abaixo da duração média do jogo). Verifique se você está acompanhando as durações dos jogos no servidor.
Rejeite ou coloque em quarentena as pontuações mais altas dos logins que apenas jogaram o jogo uma ou duas vezes, para que os atacantes tenham que produzir uma "trilha de papel" com uma jogabilidade de aparência razoável para cada login que criarem.
Pontuações "Heartbeat" durante o jogo, para que seu servidor veja o crescimento da pontuação ao longo da vida de um jogo. Rejeite pontuações altas que não seguem curvas de pontuação razoáveis (por exemplo, saltando de 0 a 999999).
Estado do jogo "Instantâneo" durante o jogo (por exemplo, quantidade de munição, posição no nível etc.), que você pode reconciliar posteriormente com as pontuações intermediárias registradas. Você nem precisa ter uma maneira de detectar anomalias nesses dados; você apenas precisa coletá-lo e, em seguida, pode voltar e analisá-lo se as coisas parecerem duvidosas.
Desabilite a conta de qualquer usuário que falhe em uma das suas verificações de segurança (por exemplo, sempre enviando uma pontuação alta criptografada que falha na validação).
Lembre-se, porém, de que você está apenas impedindo a fraude de pontuação alta aqui. Não há nada que você possa fazer para evitar isso. Se houver dinheiro em jogo no jogo, alguém derrotará qualquer sistema que você criar. O objetivo não é parar este ataque; é tornar o ataque mais caro do que ficar muito bom no jogo e derrotá-lo.