Impedindo o envio fraudulento de um painel de avaliação
-
21-08-2019 - |
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 ??p>
- Usuário joga o jogo e cliques para enviar sua pontuação
- No fundo, a bandeira envia a pontuação eo domínio de origem para um script no site principal.
- O script verificar o domínio é um dos domínios válidos o anúncio está sendo hospedados em.
- 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.
- o script retorna o hash para o Flash que calçamento-lo para o querystring de um getURL que abre o marcador da principal
- A página placar verifica o referer para ter certeza que é um dos domínios válidos.
- Se for isso, então verifica o banco de dados para o hash para se é um sinal válido
- 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
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:
- gerar um número aleatório como de um seu sal (de flash)
- Codificar o marcador usando operações matemáticas, com base no sal (de flash)
- Adicione uma soma de verificação para se certificar de que não havia têmpera na pontuação (de flash)
- Enviar a pontuação e todos os dados necessários para a pontuação apresentação página
- No servidor, validar que o placar não foi temperado com o checksum
- Se a pontuação é válida, em seguida, inseri-lo no banco de dados, mais, rejeitá-lo
- 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.