Protegendo dados HTTP de um jogo JavaScript para o servidor

8

Suponha que eu esteja fazendo um jogo JavaScript e desejo que ele atualize o servidor se o usuário concluir com êxito o jogo e seu resultado.

Como garantir que a solicitação veio do jogo JavaScript e que os dados enviados não foram violados. Estou usando PHP como a linguagem do lado do servidor.

Entendo que nenhuma estratégia será 100% à prova de idiotas, e quaisquer medidas tomadas são mais um impedimento do que proteção absoluta.

Em Editar: Suponhamos que não estamos usando a verificação do servidor da etapa de cada usuário (como em um MMO tradicional). O jogo pode ser um minijogo como parte de um jogo na Web ou educacional (invasores do espaço ou em tempo real, por exemplo) e exigir um componente do lado do servidor para cada um desses jogos pode ser entediante.

Exemplo: Suponha que, quando o jogo estiver concluído, uma solicitação é enviada ao servidor via. AJAX

game_finished.php?user_id=1&outcome=success&score=88

Um usuário pode 'falsificar' o servidor acreditando que o jogo foi concluído corretamente enviando essa solicitação para game_finished.php. Como isso poderia ser mais difícil?

Extrakun
fonte

Respostas:

10

um quebra-cabeça de blocos deslizantes, por exemplo

Este é um exemplo em que a verificação do lado do servidor é trivial. Não é necessário verificar cada etapa até que o jogo termine. Basta enviar a lista de movimentação inteira e o servidor a repetirá para garantir que esteja correta.

(Editar: o objetivo desta resposta não é escolher exemplos até encontrar um que não seja trivialmente validável. Em vez disso, deve fazer você voltar e olhar para o jogo que está realmente fazendo - provavelmente é trivialmente validável, ou precisa apenas de um pequeno ajuste.)


fonte
Eu estava pensando sobre o exemplo e não é o melhor dos exemplos. Digamos invasores do espaço então. Vou atualizar a pergunta.
Extrakun
2
O movimento dos invasores do espaço também é totalmente determinístico. Você só precisa gravar quando cada par de tiro / acerto ocorre, simular o movimento até aquele momento (que é uma equação linear simples) e garantir que foi realmente um acerto.
Finalmente entendi o que você quis dizer depois de pensar. Obrigado
Extrakun 26/10/10
Apenas uma adição ao aspecto "totalmente determinístico": se você precisar de aleatoriedade no seu jogo, passe uma semente específica para essa aleatoriedade ao cliente e salve essa semente no servidor. Quando o cliente envia o log do jogo para confirmação, o servidor também pode reproduzir as partes que envolvem aleatoriedade. O mesmo é possível para etapas que dependem da hora local. Consulte os algoritmos de salvar e carregar do Undum ( undum.com ) como um exemplo de como isso pode ser feito em JavaScript.
precisa saber é o seguinte
2

Você pode fazer isso da maneira Warcraft: use Javascript apenas para enviar comandos de movimento ao servidor e deixe o servidor manipular a lógica.

Isso ainda deixa você aberto para robôs (programas javascript que movem as coisas mais rapidamente e com mais precisão do que humanamente possível), mas esse é um grande passo em comparação a deixar a porta aberta para o truque /game_finished.php.

egarcia
fonte
1

Se o cliente estiver calculando a pontuação, não há como validá-la além de (como indicado) fazer com que o servidor repita o jogo para confirmar que obtém a mesma pontuação.

No entanto, existem tipos de jogos que você pode criar que não funcionam com base apenas em uma pontuação numérica. Um script do lado do servidor pode gerar um problema matemático de adição aleatória, por exemplo, e quando o usuário envia a resposta, ele pode comparar a resposta com a correta e pontuá-lo no servidor.

Mas se o seu jogo for complexo (como o exemplo dos invasores do espaço), não há muito o que fazer além de a) confiar no cliente ou b) deixar o servidor gerenciar o jogo.

Tim Holt
fonte
-1

Existem muitos métodos, mas todos eles falharão eventualmente. Você pode adicionar algum valor de hash ou chave de consulta renovada a cada consulta.

Mas o mais importante é que todas as suas funções de super codificação são enviadas como códigos-fonte para o navegador dos clientes e esse é o problema. Para dificultar um pouco, você pode usar a função send by Ajax query, para que as fontes não estejam disponíveis em um URL. A função deve ser compactada, e talvez até em partes, para que seja mais difícil copiar tudo. Eu também verificaria esse código na página como http://jsbeautifier.org/ se, depois de torná-lo legível, seu código for fácil de entender.

Pensador
fonte