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?
fonte
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.
fonte
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.
fonte
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.
fonte