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:
- Ele está logado e vivo?
- Ele pode fazer isso (nível, emprego, facção)?
- Ele está no lugar certo?
- Os valores são válidos?
- 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.