Servidores de Jogos

Nunca confie no cliente: validando dados do jogador no servidor

Nunca confie no cliente: validando dados do jogador no servidor

A regra mais importante da programação de servidores de jogos: tudo que vem do cliente pode ser falsificado. Um cliente modificado pode enviar respostas de diálogo, cliques e comandos que o seu código não esperava.

Exploits clássicos

Diálogo que nunca foi aberto

Um cliente modificado envia uma resposta para o diálogo da loja sem estar perto da loja, ou para o diálogo do admin sem ser admin.

Defesa: guarde qual diálogo o jogador tem aberto e compare:

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    if (dialogid != DialogoAberto[playerid]) return 1;
    DialogoAberto[playerid] = -1;
    // ...
}

listitem fora do intervalo

A loja tem 5 itens, mas chega listitem = 50 ou -1. Se isso vira índice de array, o resultado é um erro ou, pior, acesso a outro dado.

Defesa: if (listitem < 0 || listitem >= sizeof(ItensLoja)) return 1;

Valores negativos

/pagar 5 -100000 pode "tirar" dinheiro de outro jogador. /depositar -500 pode criar dinheiro.

Defesa: valide sempre valor > 0 e limites máximos.

Preço vindo do cliente

Ler o preço do texto do diálogo ou do textdraw. O jogador não deveria controlar isso.

Defesa: preço sempre de uma tabela do servidor.

Distância e contexto

Comprar a casa estando do outro lado do mapa, ou abrir o porta-malas de um carro distante.

Defesa: verifique distância (IsPlayerInRangeOfPoint), mundo virtual, interior e estado (vivo, não preso, logado).

Textos maliciosos

Nomes e descrições com caracteres estranhos, tamanhos enormes ou tentativas de SQL injection.

Defesa: limite tamanho, filtre caracteres e use %e no mysql_format.

Checklist por ação

Antes de executar qualquer ação vinda do jogador, pergunte:

  1. Ele está logado e vivo?
  2. Ele pode fazer isso (nível, emprego, facção)?
  3. Ele está no lugar certo?
  4. Os valores são válidos?
  5. Ele tem recursos (dinheiro, item) suficientes?

O open.mp ajuda, mas não faz tudo

O open.mp trouxe correções e validações em várias áreas em relação ao SA-MP. Mesmo assim, a lógica do seu jogo só você conhece. A validação final é responsabilidade do gamemode.

Hospede seu servidor com a VittHost

Os planos OPENMP-BR da VittHost oferecem a infraestrutura segura (servidores no Brasil, proteção DDoS, painel Pterodactyl, MySQL incluso) para o seu código seguro. Compatibilidade total com scripts SA-MP e teste grátis de 3 dias.

Compartilhar:

Pronto para hospedar seu próximo projeto?

VPS com painel pré-instalado em 1 clique. Ativação imediata.

Ver planos VPS