Servidores de Jogos

Sistema de registro e login com hash de senha

Sistema de registro e login com hash de senha

O sistema de contas é a porta de entrada do servidor e o alvo preferido de quem quer roubar contas. Ele precisa ser seguro desde o início.

Regra de ouro: nunca salve a senha em texto

Se o banco vazar (backup esquecido, gamemode vazado, admin mal-intencionado), senhas em texto puro expõem seus jogadores, que costumam reutilizar a mesma senha em outros lugares.

Guarde apenas o hash da senha, gerado por um algoritmo lento e com salt, como bcrypt (via plugin) ou as funções de hash disponíveis no open.mp (consulte a documentação da sua versão). Evite hashes rápidos e sem salt, como MD5 ou SHA-1 simples, e o antigo udb_hash.

Tabela de contas

CREATE TABLE contas (
  id INT AUTO_INCREMENT PRIMARY KEY,
  nome VARCHAR(24) NOT NULL UNIQUE,
  senha_hash VARCHAR(255) NOT NULL,
  registrado_em DATETIME DEFAULT CURRENT_TIMESTAMP,
  ultimo_login DATETIME NULL
);

Fluxo

  1. OnPlayerConnect: zera as variáveis e consulta se o nome existe (mysql_tquery com %e);
  2. Conta existe: mostra o diálogo de login (DIALOG_STYLE_PASSWORD);
  3. Não existe: mostra o diálogo de registro;
  4. Registro: valida a senha (tamanho mínimo), gera o hash e faz o INSERT;
  5. Login: busca o hash e verifica a senha com a função do algoritmo (nunca compare textos);
  6. Sucesso: marca Logado = true, carrega os dados e libera o spawn.

Hash e verificação com bcrypt são operações lentas de propósito. Use as versões assíncronas (com callback) do plugin para não travar o servidor.

Bloqueie o spawn antes do login

public OnPlayerRequestSpawn(playerid)
{
    if (!Jogador[playerid][jLogado]) return 0;
    return 1;
}

Bloqueie também comandos e chat para quem não está logado.

Limite de tentativas

if (++TentativasLogin[playerid] >= 3)
{
    SendClientMessage(playerid, -1, "Muitas tentativas. Tente novamente mais tarde.");
    Kick(playerid);
}

Para ataques insistentes, registre o IP e aplique um bloqueio temporário.

Mais cuidados

  • Nunca mostre a senha em logs ou mensagens;
  • Um Kick logo após SendClientMessage pode impedir a mensagem de chegar. Use um timer curto antes do kick;
  • Ofereça troca de senha dentro do jogo, pedindo a senha atual.

Hospede seu servidor com a VittHost

Os planos OPENMP-BR da VittHost incluem MySQL para o seu sistema de contas. Servidores no Brasil, painel Pterodactyl, proteção DDoS, 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