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
- OnPlayerConnect: zera as variáveis e consulta se o nome existe (
mysql_tquerycom%e); - Conta existe: mostra o diálogo de login (
DIALOG_STYLE_PASSWORD); - Não existe: mostra o diálogo de registro;
- Registro: valida a senha (tamanho mínimo), gera o hash e faz o INSERT;
- Login: busca o hash e verifica a senha com a função do algoritmo (nunca compare textos);
- 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
Kicklogo apósSendClientMessagepode 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.