Sistema de contas e login com banco de dados
O login é a porta de entrada do seu servidor — e um dos sistemas mais sensíveis. Veja os pontos essenciais para construir um sistema de contas seguro.
Estrutura da tabela
CREATE TABLE contas (
id INT AUTO_INCREMENT PRIMARY KEY,
usuario VARCHAR(32) NOT NULL UNIQUE,
senha_hash VARCHAR(255) NOT NULL,
serial_registro VARCHAR(64),
criado_em DATETIME DEFAULT CURRENT_TIMESTAMP,
ultimo_login DATETIME NULL
) DEFAULT CHARSET=utf8mb4;
Nunca guarde a senha em texto puro
O MTA oferece passwordHash e passwordVerify, com o algoritmo bcrypt:
-- registro
local hash = passwordHash(senha, "bcrypt", {})
dbExec(db, "INSERT INTO contas (usuario, senha_hash, serial_registro) VALUES (?, ?, ?)",
usuario, hash, getPlayerSerial(jogador))
-- login
dbQuery(function(qh)
local linhas = dbPoll(qh, 0)
local conta = linhas and linhas[1]
if not conta or not passwordVerify(senha, conta.senha_hash) then
return avisar(jogador, "Usuário ou senha incorretos.")
end
logarJogador(jogador, conta)
end, db, "SELECT id, senha_hash FROM contas WHERE usuario = ?", usuario)
As funções também aceitam uso assíncrono com callback, evitando travar o servidor durante o cálculo do hash — consulte a wiki.
Validações
No servidor (o cliente só envia os dados):
- Usuário: tamanho mínimo e máximo, apenas caracteres permitidos;
- Senha: tamanho mínimo;
- Usuário já existe?
- Limite de contas por serial (evita criação em massa).
Mensagens genéricas
Responda "usuário ou senha incorretos" — nunca "usuário não existe" ou "senha errada". Isso dificulta descobrir quais contas existem.
Proteção contra força bruta
Limite tentativas:
local tentativas = {}
-- no login falho:
tentativas[jogador] = (tentativas[jogador] or 0) + 1
if tentativas[jogador] >= 5 then
kickPlayer(jogador, "Muitas tentativas de login.")
end
Para ataques distribuídos, registre as falhas por serial e por conta.
Comunicação segura
- O cliente envia usuário e senha por
triggerServerEvent— o MTA já criptografa o tráfego da conexão do jogo; - Nunca envie o hash de volta ao cliente;
- Não registre senhas em logs.
Sessão
Após o login:
- Guarde o id da conta em uma tabela no servidor (
contaDe[jogador] = id); - Bloqueie ações de jogo até o login ser concluído;
- Salve e limpe os dados no
onPlayerQuit.
Recuperação de conta
Considere vincular a conta a um e-mail ou ao Discord, com um fluxo seguro de redefinição, e ofereça suporte da staff com verificação de identidade (serial, dados do personagem).
Hospede seu servidor com a VittHost
Todos os planos MTASA-BR da VittHost incluem 1 banco MySQL para o seu sistema de contas. Servidores no Brasil, painel Pterodactyl, proteção DDoS, downloads acelerados por nginx dedicado e teste grátis de 3 dias.