Como você evita que seu jogo na Web JavaScript / HTML5 seja copiado ou alterado?

45

Estou no meio do planejamento de um jogo criado usando JavaScript e HTML5.

Estou tendo problemas para entender como você pode impedir que alguém simplesmente copie o JavaScript do servidor da Web e crie seu próprio jogo (não é minha maior preocupação) ou substitua suas próprias funções JavaScript e ofereça qualquer esperança de clientes confiáveis ​​no selvagem se o jogo eventualmente oferecer suporte ao multiplayer.

Alguma coisa pode ser feita para impedir que alguém leia o JavaScript?

Caso contrário, todo o processamento do jogo deve ocorrer em um servidor em algum lugar com as únicas responsabilidades do cliente em capturar a entrada do usuário e desenhar gráficos?

cristão
fonte
22
Você é o último parágrafo que lê sobre o certo, verdadeiro para aplicativos de negócios e verdadeiro para jogos, sempre trate o cliente como hostil.
Nate
4
Se eu conseguir lê-lo, meu navegador já possui uma cópia. Então também posso salvá-lo em outro lugar. Tudo o que você permitir ler, também pode ser copiado.
amigos estão

Respostas:

44

Mantenha todos os dados e lógicas do jogo no servidor. Parte do jogo que está do lado do cliente pode ser copiada usando as ferramentas apropriadas (mesmo que seja em Flash ou Java), então aceite-o e não se importe muito com isso.

Para manter seu javascript menos copiável, devido à má legibilidade, você pode reduzi-lo . De qualquer forma, é uma boa prática, pois torna o download do site de jogos mais rápido.

Aidas Bendoraitis
fonte
4
Dependendo das práticas de codificação, todo o conteúdo do servidor também pode ser comprometido. Minificar o código e ofuscar apenas detém aqueles que não querem gastar tempo e mapear logicamente o que está fazendo. Resumindo, se você está preocupado com os direitos de propriedade intelectual do seu código; não coloque na web.
João
1
Isso não significa que você não deva minificar, isso impede as pessoas preguiçosas. Você também pode tentar processar sua lógica de jogo no servidor e retornar objetos json através do ajax, mas o retorno ainda pode ser visualizado com o firebug. Ofusque sua versão de produção, mas mantenha uma versão com muitos comentários para você (isso dificulta a manutenção). Você pode fazer coisas para impedir as pessoas, mas nunca é 100% seguro.
John
3
De fato. A expansão do código compactado nem exige muito esforço. jsbeautifier.org
James
@ John, observe que às vezes dissuadir pessoas preguiçosas é irrelevante, já que alguns jogos são arruinados quando um trapaceiro aparece, então não é relevante se apenas um ou muitos estão trapaceando.
o0 '.
11

como você pode impedir que alguém simplesmente copie o JavaScript do servidor da Web e crie seu próprio jogo (não é minha maior preocupação)

É aqui que a lei ajuda. Na prática, isso não parece acontecer com muita frequência.

ou substituindo suas próprias funções JavaScript e arriscando qualquer esperança de clientes confiáveis, caso o jogo eventualmente suporte multijogador.

Não há clientes confiáveis ​​na natureza, exatamente por esse tipo de razão. Desista deste sonho agora. :)

Kylotan
fonte
A lei não será de muita utilidade quando o site que o hospeda estiver em um país que não se preocupa muito com direitos de propriedade intelectual ou que seja contrário ao seu país por qualquer motivo. Mesmo quando não é esse o caso, o custo de iniciar uma ação legal (potencialmente internacional) provavelmente está muito além dos recursos financeiros de alguém que faria essa pergunta aqui.
Paul Legato
A intenção da resposta não era tanto recomendar uma ação legal, mas sugerir que tentar bloquear esse software é inútil, pelo menos em parte porque muitas das pessoas que o copiam ficam desanimadas por lei, mas também porque os clientes pode sofrer engenharia reversa, independentemente de usar Javascript ou não.
Kylotan
8

Assim como todo mundo recomendou; mantenha o máximo de código possível do lado do servidor.

Um método que usei para lidar com a cópia de código é um pouco estranho, mas funcionou bem até agora.

  • No lado do servidor, gere um ID exclusivo e armazene-o para mais tarde.
  • No lado do servidor, adicione um ID exclusivo ao elemento de script durante a renderização em html.
  • No lado do cliente, crie uma conexão WebSocket e passe o ID exclusivo para o servidor.
  • No lado do servidor, corresponda o ID à lista atual.
  • Se a correspondência não for encontrada, feche a conexão.
  • Se a correspondência for encontrada, substitua o manipulador de mensagens pelo seu "adequado" e descarte o ID.
  • Transmita seu código secreto para o cliente como JSON, {"func": "function () {dostuff ();}"}
  • No lado do cliente, observe as mensagens, se elas contiverem "func", avalie-a.

Agora, seu código secreto está executando no lado do cliente e não será exibido na fonte de exibição ou nos inspetores / consoles. Ainda há maneiras de obter o código, mas é um pouco mais difícil.

Stephen Belanger
fonte
Se eu precisasse pegar algo da solução acima; Eu conectaria o WebSocket verdadeiro também e tentaria criar um "cliente falso" ou usar uma ferramenta de depuração do Firebug em um navegador e parar o script para verificar os valores.
amigos estão
Você não pode criar um cliente falso, a menos que, de alguma forma, possa prever quais IDs únicos estão disponíveis no momento, pois eles são gerados no tempo de carregamento da página e lançados no tempo de conexão do script. Além disso, é difícil parar o script e observar os valores, pois você está avaliando uma função anônima. Como eu disse, ainda existem maneiras de obter o código, é apenas mais difícil. Na maioria das vezes, o suficiente para que seu código seja "suficientemente seguro". Você não pode fazer muito mais do que isso com o código do lado do cliente.
precisa
Seria muito fácil escrever um cliente falso que apenas carrega o cliente real do servidor e raspa o valor secreto atual a cada vez que é iniciado.
Paul Legato
Eu não diria que é "fácil" tanto quanto "não impossível". Como eu disse, existem maneiras de contornar isso. Não existe um sistema perfeitamente seguro. Interfaces apenas obscurecidas adequadamente, de modo que a maioria achará muito esforço para invadir. Nesse caso, você estaria transmitindo bits de código, portanto, um hacker precisaria criar um cliente para receber e organizar o código em uma estrutura útil. Você transmitia o código conforme necessário, para que o hacker não tivesse acesso imediato ao despejo de código completo.
Stephen Belanger
3

A única maneira de ter certeza razoável de que seu código de jogo será seguro é criar um tipo de jogo cliente / servidor e colocar o máximo de código possível no servidor. E, claro, torne esse servidor seguro!

O principal problema é que, se o código estiver em execução no meu computador, posso inspecioná-lo, descompilá-lo e descobrir como ele funciona. Isso vale para JavaScript, Flash, C ++, qualquer outra coisa. De fato, no desenvolvimento do MMO (que é onde está a maior parte da minha experiência profissional), a suposição desde o início é que o cliente está comprometido: tudo o que você escreveu para o cliente já está nas mãos de quem o desejar, malicioso ou não.

O código de redução fornece uma pequena quantidade de proteção contra pessoas com preguiça de desminificá-lo usando uma das muitas ferramentas disponíveis. (Mas o código de produção deve ser reduzido para reduzir sua pegada de dados.)

Mas se você estiver em uma situação em que, digamos, seu chefe deseja algum tipo de proteção de código, você pode pesquisar no Google "ofuscador Javascript" - há muitos softwares gratuitos e pagos por aí que tornam JS, pelo menos, tão impermeável descompilar como o Flash é.

DariusK
fonte
Eu só quero ressaltar que o C ++ não está no mesmo nível do Javascript. C ++ compila para montagem, que alguém precisa ser lido para entender a lógica de um jogo. Cada instrução em C ++ pode criar várias linhas na montagem, o que a torna uma tarefa muito demorada. Ofuscar o javascript não é o mesmo, pois é o mesmo idioma. Qualquer um pode "embelezá-lo" e começar a ler declarações quase legíveis por humanos.
TomTsagk
3

Além de toda essa discussão sobre ofuscação de código, coloque uma declaração de direitos autorais muito clara no topo de cada arquivo e torne óbvio que a licença não permite alterações ou uso comercial. Isso lhe dá um recurso legal se alguém tentar copiá-lo. Se você não está disposto a recorrer, a questão toda é principalmente acadêmica.

coderanger
fonte
Isso é bom para o que vale, mas não é muito. Na prática, o conceito de propriedade intelectual não é reconhecido em muitos países e, em qualquer caso, os custos legais de um processo judicial provavelmente estão muito além do que um pôster para este site tem disponível, principalmente se o atacante estiver em outro país.
Paul Legato
0

Eu acho que se você tornar seu jogo multi-jogador, o que implica manter a lógica do jogo no servidor, você provavelmente tornaria pelo menos menos atraente roubar. Você não pode confiar realmente no cliente. Como alguém já mencionou, existem ferramentas para linguagens compiladas como Java e Flash, que podem fazer engenharia reversa do texto do código a partir do código de bytes.


fonte
-1

Você precisa usar um Javascript Minifier. Há muitas opções disponíveis, sinta-se à vontade para encontrar uma que você gosta. Para economizar algumas pesquisas, aqui está uma que você pode experimentar o Yahoo Minifier . Eu não corri isso sozinho, mas presumo que ele fará o que você precisa. O objetivo é 1) reduzir o tamanho do arquivo e 2) ofuscar o código. Isso é feito removendo todos os espaços em branco, comentários e substituindo nomes de variáveis ​​por nomes mais curtos e sem sentido.

Atualmente, a maioria dos aplicativos da Web possui uma quantidade significativa de Javascript e usa ferramentas como essas para tentar proteger seu IP. Como outros já disseram, você sempre deve perguntar: "Posso fazer isso no servidor?" para operações importantes ou sensíveis, mas acredito que isso deve oferecer alguma proteção.

Alex Schearer
fonte
7
A segurança pela obscuridade obscurece o potencial de segurança. :)
Rushyo 10/09
1
Oh, por favor. Eu ouço essa citação o tempo todo, mas não é absolutamente verdade. Verdade seja dita, obscurecer o JS pelo menos impediria algumas pessoas.
2
minifier não o ajuda. Acredito que a maioria das pessoas "sérias" sabe como "expandir" esses scripts novamente.
amigos estão
1
@Sergio: você ouve essa citação o tempo todo porque, você sabe, é verdade . Isso deterá "algumas" pessoas, é verdade, mas dissuadir "algumas" pessoas não faz sentido: quando você é rachado uma vez , desce.
o0 '.
-1

Use o compilador de fechamento do Google http://code.google.com/closure/compiler/ Não é apenas um minimizador de js;)

Quais são os benefícios do uso do Closure Compiler?

  1. Eficiência. O Closure Compiler reduz o tamanho dos arquivos JavaScript e os torna mais eficientes, ajudando o aplicativo a carregar mais rapidamente e reduzindo as necessidades de largura de banda.

  2. Verificação de código. O Closure Compiler fornece avisos para JavaScript ilegal e avisos para operações potencialmente perigosas, ajudando você a produzir JavaScript com menos bugs e fácil manutenção.

Deyaa
fonte
-1

Ou você pode usar algo como o Game Maker HTML5 para criar seu jogo, que ofuscará o código para você. Isso significa que tornará o código ilegível para os seres humanos. E será quase impossível editar.

Gwhiz
fonte
2
-1 Ofuscação só vai tão longe. Certamente não protegerá o jogo de ser copiado ou alterado - como foi mencionado nas outras respostas ofuscantes a esta pergunta.
Doppelgreener 22/10/12
-1

Qualquer coisa proprietária deve ser mantida no lado do servidor. No lado do cliente, você fornece apenas o suficiente para facilitar o uso do jogo.

Edward Coast
fonte
-1

Colocar tudo no servidor pode ter um problema de desempenho e não usar todo o potencial da Web como o conhecemos hoje.

Você pode escrever seu código em c ++ e compilá-lo em binários.

Cliente nativo (NaCl).

Consulte https://stackoverflow.com/questions/9018537/how-to-run-c-programs-on-the-web-inside-a-browser

yehuda mazal
fonte
Bem-vindo ao GDSE. O OP está perguntando sobre JavaScript especificamente; portanto, embora eles possam reescrever em C ++ e usar NaCl, essa solução realmente não atende às necessidades, conforme indicado. Além disso, as respostas devem ser o mais independentes possível - mencionar NaCl e despejar um link não é tão bom quanto oferecer um resumo sobre o que é NaCl ou por que isso pode ajudar.
Pikalek 14/08