Como fiz meu jogo de palavras não entregar a resposta pelo DevTools
Uns dias atrás postei aqui o PALAVRA 7, um jogo de adivinhar palavra que eu fiz. Uma das primeiras coisas que meus amigos da faculdade tentaram foi abrir o DevTools pra achar a resposta kkkk. Então resolvi contar como o jogo se protege disso, porque acho que serve pra qualquer jogo web com ranking.
O problema
Em muito jogo de navegador, a resposta já vem junto com a página, num JSON ou numa variável. Aí basta abrir a aba Network, e acabou a graça. Se o jogo tem ranking, pior ainda: dá pra mandar pontuação falsa.
O que eu fiz
-
A palavra secreta nunca sai do servidor antes do fim. O navegador só recebe o que o jogador já tem direito de ver: o tamanho da palavra, as pistas liberadas até aquela tentativa e as cores de cada palpite.
-
Cada palpite é conferido no servidor. O navegador manda a palavra que a pessoa digitou, e o servidor devolve as cores (fixa, solta ou ausente) e a Sintonia. A comparação acontece lá, não no JavaScript do cliente.
-
Pontuação, XP e sequência também são calculados no servidor. O cliente nunca manda "fiz 500 pontos". Ele só manda os palpites, e o servidor calcula o resultado com base no que realmente aconteceu, inclusive o tempo, medido pelo relógio do servidor.
-
A resposta só aparece quando a partida termina, seja por acerto ou porque as tentativas acabaram.
-
Limite de requisições e sessão com cookie httpOnly, pra ninguém ficar disparando milhares de palpites por segundo nem roubar a sessão de outra pessoa via JavaScript.
O custo disso
Não é de graça: o jogo precisa de servidor e banco de dados, em vez de ser só um site estático. Uso Node + Express + Postgres, hospedado no plano grátis do Render com banco no Supabase. Em troca, o ranking fica justo.
Se alguém aqui achar um jeito de burlar, me conta nos comentários, que eu quero saber e corrigir. 😄