Servidores de Jogos

Sistema de contas e login com banco de dados

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.

Compartilhar:

Pronto para hospedar seu próximo projeto?

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

Ver planos VPS