Estou pensando em me aventurar em criar um rpg de ação para um jogador em js / html5 e gostaria de evitar trapacear. Não preciso de 100% de proteção, já que não será um jogo multiplayer, mas quero um certo nível de proteção.
Então, quais estratégias você sugere além da minificação e ofuscação?
Eu não me incomodaria em fazer uma verificação simples no servidor, mas não quero seguir o caminho do Diablo 3 mantendo todas as alterações no estado do jogo no servidor.
Como vai ser um tipo de rpg, tive a idéia de criar um inspetor de estatísticas que verifique mudanças bruscas em seus valores, mas não tenho certeza de quão consistente e confiável possa ser.
E quanto a variáveis e escopos de funções? Trabalhar em escopos menores sempre que possível é mais seguro, mas vale a pena o esforço?
Existe alguma maneira para o javascript auto-inspecionar seu texto, como em uma soma de verificação?
Existem soluções específicas para navegadores? Eu não me incomodaria em restringi-lo ao Chrome apenas nas versões iniciais.
fonte
Respostas:
A resposta curta é que você não pode fazê-lo. Qualquer coisa que execute no lado do cliente, especialmente da fonte, pode ser modificada para derrotar suas táticas trivialmente. Se você colocar um verificador do lado do cliente para procurar alterações abruptas, um usuário poderá simplesmente desativar o verificador.
A boa notícia é que, geralmente, há muito pouca trapaça nos jogos para um jogador. A única exceção importante é para jogos que têm grandes comunidades de "altas pontuações no youtube" como o Line Rider, onde os jogadores competem entre si pelo YouTube.
Se você está buscando isso, ou é teimoso demais para aceitar que as pessoas trapaceiam no jogo ou está mantendo uma pontuação alta (que é uma forma de multiplayer), o que você deve fazer é todos os cálculos do lado do servidor . Sim, tudo o que importa. Você não pode nem repetir o lado do cliente de cálculo para tentar dar ao usuário a pontuação e, em seguida, 'verificá-la' com o servidor, porque o usuário pode simplesmente desativar a verificação e desativar qualquer sistema que garanta a verificação.
Eu gostaria que houvesse uma resposta melhor para isso, mas não existe.
Dito isto, há coisas que você pode fazer para tornar um pouco mais difícil de enganar. Eles não impedirão ninguém sério de fazer isso e liberar um kit de ferramentas para trapacear, mas isso os atrasará:
Tão. Como você vê, provavelmente não vale a pena seguir esse caminho. É difícil. Requer muitas práticas de codificação realmente tolas, e ainda é relativamente fácil de derrotar. Você precisará fazer todos os cálculos do lado do servidor para evitar trapaças. Ou deixe ir e aceite que a trapaça acontecerá.
fonte
Eu já respondi uma pergunta como essa aqui e lamento dizer, mas:
É a pior coisa que você poderia dizer aqui. Se você quiser fazer um mecanismo "anti-fraude", precisará fazer isso. Você pode adicionar o que quiser do lado do cliente, para facilitar o trabalho do servidor, mas nunca deve confiar no cliente. Toda a lógica que você possui deve ser pelo menos do lado do servidor. Você pode reproduzi-lo do lado do cliente, se quiser, mas nenhuma solução somente do lado do cliente fará isso.
E, a propósito, se você quiser encontrar a fraqueza do seu programa, não ofusque-o, deixe que as pessoas vejam seu código e digam "aqui, você tem um problema".
Isso é bom para você, para seu código, para seus usuários e para a comunidade.
fonte
Bem, um bom lugar para começar é usar a função Object.freeze (que ativará a proteção contra o patch de objetos).
Isso "impede que novas propriedades sejam adicionadas", "impede que as propriedades existentes sejam removidas", "impede que as propriedades existentes ou sua enumerabilidade, configurabilidade ou gravabilidade sejam alteradas"; quaisquer alterações no estado interno devem ser feitas por meio de acessadores. O exemplo a seguir funciona no chrome (deve funcionar no firefox, embora eu não conheça o IE ...):
fonte
Object.freeze = function(o) {};
no console JS.infelizmente, você deve seguir o caminho do diablo 3, se estiver realmente preocupado com hacks / cheats. se não estiver, as verificações básicas que você deve fazer ou é altamente recomendável que você faça.
... e assim por diante
1 ponto é um pouco complicado é a posição do herói, já que você não está muito preocupado com isso, pode deixá-lo, mas é melhor você fazer isso também com uma verificação mínima como a abaixo
Espero que isso ajude, parece difícil, mas você precisa aprender a criar jogos de trabalho reais
fonte
Basicamente não é possível. Seria tão fácil contornar qualquer coisa que você colocar no lugar para evitar trapacear.
O problema é que, com qualquer software que você distribuir, as pessoas podem modificá-lo facilmente na memória.
Além disso, se eles querem trapacear, deixe-os. Eles estão apenas arruinando o jogo por si mesmos. Não há nenhum uso prático real para trapacear nessa situação, você apenas destruiria a jogabilidade por si mesmo.
fonte
Tive uma idéia para uma medida que você pode tomar para evitar / reduzir trapaças (além de outras respostas). Você pode configurá-lo para que o cliente não receba todo o código-fonte de uma só vez, e que toda vez que o cliente queira, por exemplo, comprar um novo item na loja, o cliente precisará enviar determinadas informações para o servidor e só recebe todas as informações do que eles estão comprando se todas as informações corresponderem ao que deveria. Caso contrário, o servidor coloca na lista negra seu IP ou algo assim.
Você pode usar isso em conjunto com o que o Dampes8n disse sobre o uso de diferentes versões de origem, que, se você puder descobrir uma maneira de gerar várias versões diferentes, para que cada usuário esteja executando uma versão de origem totalmente diferente a cada vez, isso falhará no verifique nas listas negras também a versão de origem, para que nunca mais forneça as informações corretas do item para essa versão de origem.
A principal razão pela qual isso seria eficaz é que, se um hacker não acertar o hack da primeira vez, isso tornaria muito mais difícil a modificação do hack, porque toda vez que o hack não funciona perfeitamente, eles precisam altere seu IP e escreva o hack novamente para a nova versão de origem.
fonte
Sim, não pode totalmente ser feito. Sempre verifique no servidor. Qualquer coisa que tenha impacto no jogo deve exigir autorização do servidor.
Essa é a extensão em que repetirei outras respostas.
No entanto, podemos fazer muito mais para evitar fraudes do que apenas checar o servidor. Bem, talvez tenhamos que adicionar algumas verificações especiais ao servidor.No entanto, esteja ciente de que as verificações do lado do cliente não são inúteis, pois economizam largura de banda e trabalho do servidor quando os trapaceiros não estão envolvidos.
Com isso dito:
Sim, isso tudo são mitigações. Ainda podemos ter um navegador personalizado que não verifica a integridade e permite que você alcance e mexa com variáveis nos escopos locais ... então o código do jogo enviará os dados modificados com o token certo, e é aí que as verificações do servidor são realizadas Toque.
fonte