Pergunta

Eu estou trabalhando no back-end para um jogo em Flash e preciso Secure os dados entrando no placar.

O jogo vai ser hospedado em muitos sites em um banner, o usuário vai jogar o jogo no anúncio, em seguida, clicar para o site principal para salvar seus dados.

No momento eu estou pensando ao longo das linhas desta

  1. Usuário joga o jogo e cliques para enviar sua pontuação
  2. No fundo, a bandeira envia a pontuação eo domínio de origem para um script no site principal.
  3. O script verificar o domínio é um dos domínios válidos o anúncio está sendo hospedados em.
  4. Se tudo estiver certo, o script cria um hash desse escore e de domínio e as armazena no banco de dados ao lado da pontuação.
  5. o script retorna o hash para o Flash que calçamento-lo para o querystring de um getURL que abre o marcador da principal
  6. A página placar verifica o referer para ter certeza que é um dos domínios válidos.
  7. Se for isso, então verifica o banco de dados para o hash para se é um sinal
  8. válido
  9. o usuário, em seguida, preenche seus dados e o registro é atualizado com base em hash

A última vez que verifiquei Flash não enviar Informações referer, que lança um bocado uma chave para o meu plano. Assim, há um padrão já estabelecido para este tipo de Flash / interação com o banco?

Que tipo de hashing / checksuming devo usar no passo 4? Qual é o nome correto para esse tipo de operação, é um hash, uma soma de verificação ou algo mais?

Eu entendo que ser uma tecnologia clientside, Flash nunca vai realmente ser tão seguro, mas na minha mente, algo como o acima é tão dificil como você está indo para torná-lo para cortar este tipo de aplicação.

UPDATE:. Meu principal objetivo é tornar mais difícil para as pessoas a encontrar o URL do script que adiciona a pontuação para o banco de dados e simplesmente spam-lo com pontuações falsas

Obrigado, Greg

Foi útil?

Solução

Eu tenho trabalhado anteriormente na indústria do jogo, e fez algo ao longo destas linhas. Que eu saiba, nunca ninguém se preocupou quebrar a pontuação de enviar parte.

A forma como foi feito foi:

  1. gerar um número aleatório como de um seu sal (de flash)
  2. Codificar o marcador usando operações matemáticas, com base no sal (de flash)
  3. Adicione uma soma de verificação para se certificar de que não havia têmpera na pontuação (de flash)
  4. Enviar a pontuação e todos os dados necessários para a pontuação apresentação página
  5. No servidor, validar que o placar não foi temperado com o checksum
  6. Se a pontuação é válida, em seguida, inseri-lo no banco de dados, mais, rejeitá-lo
  7. Se você quiser, você pode logar ip endereços dos remetentes de pontuação que violem as somas de verificação (talvez uma política de três checksums ruim, você está fora) e adicionar um script para bani-los de acessar o servidor para 1h, mas esta provavelmente não será necessária a menos que alguém quer quebrar seu código tão ruim assim.

Nota: O hashing / checksuming foi feita usando uma função personalizada. não precisa de algo muito seguro. Foi feita usando um cálculo sobre o sal ea pontuação. Algumas operações matemáticas simples como somas, multiplicações e subtrações.


Editar : um algoritmo simples / matemática para o checksum

Vamos dizer que o usuário tem uma pontuação de 5885 .
Você gerar um número aleatório como um sal de 134789 (comprimento constante, almofada com 0)

cryptedScore = Score * Salt (você deve usar algo um pouco mais complexo aqui, mas é apenas um exemplo)

No nosso exemplo, a pontuação crypted seria: 793233265

Agora, a soma de verificação, digamos que você quer ter um valor de 253 como uma soma de verificação.
Você pode adicionar todos os números de sua pontuação crypted 7 + 9 + 3 + 2 + 3 + 3 + 2 + 6 + 5 = 40

Agora, você calcula o valor de sua soma de verificação para esta pontuação
253 - (Soma de números de pontuação crypted% 253 )

Agora, temos os seguintes números:
o sal = 134789
a pontuação crypted = 793233265
o checksum = 40

Você faz uma solicitação para o servidor, o envio de 134789793233265040 como uma pontuação.

No servidor de pontuação, você pode dividir 793233265 por 134789 dando 5885 e validar a soma de verificação usando a mesma função que antes.

Se o checksum falhar, então os números foram adulterados.

Você provavelmente poderia acabar com algo muito mais seguro, mas deve fazer o truque.

Outras dicas

Essencialmente, você não quer para verificar a pontuação é proveniente de um cliente legítimo, você deseja verificar o cliente realmente jogou o jogo para alcançar a pontuação. Essencialmente, o melhor que você pode esperar é as pessoas serem obrigados a criar um AI para jogar o jogo.

Aqui estão algumas coisas que você pode fazer:

  • Entrar as entradas para o jogo e enviar aqueles juntamente com a pontuação. O servidor pode, então, validar que o corresponde pontuação para um possível jogo. Você também pode detectar submissões duplicadas desta forma.
  • Aplicar limitação de taxa para parar os clientes de apresentar pontuação em um ritmo obviamente desumana. Aplicar limites superiores para as pontuações permitidas com base no que é realmente possível para alcançar e limites mais baixos em coisas como ações por segundo.
  • Use as entradas anteriores para semear parcialmente o pseudo gerador de números aleatórios (supondo que você usar um). Isso torna menos provável que os clientes podem alterar uma submissão ligeiramente e ainda obter um jogo / pontuação de combinação válida.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top