Servidores de Jogos

Validando eventos do cliente para evitar exploits

Validando eventos do cliente para evitar exploits

A maioria dos exploits em servidores de MTA — dinheiro infinito, itens duplicados, dano absurdo, teleportes — vem de eventos remotos mal validados. Clientes modificados podem disparar qualquer evento, com qualquer argumento, quantas vezes quiserem.

Regra 1: use client

Em um evento disparado por triggerServerEvent, a variável client contém o jogador que realmente enviou o evento. Já source é escolhido por quem disparou — e pode ser qualquer elemento.

addEvent("rp:usarItem", true)
addEventHandler("rp:usarItem", root, function(item)
    if client ~= source then return end -- alguém tentando agir em nome de outro
    -- ...
end)

Regra 2: valide tipos e faixas

if type(item) ~= "string" or #item > 32 then return end

if type(quantidade) ~= "number" or quantidade < 1 or quantidade > 100
   or quantidade ~= math.floor(quantidade) then
    return
end

Números negativos, decimais, NaN e valores enormes são clássicos.

Regra 3: valide o contexto

Pergunte: esse jogador pode fazer isso agora?

  • Está perto do NPC/loja/local?
  • Tem o emprego/cargo necessário?
  • Tem o item no inventário (segundo o servidor)?
  • Está vivo, logado, fora da prisão?
if not estaNoEmprego(client, "taxista") then return end
if getDistanceBetweenPoints3D(x, y, z, getElementPosition(client)) > 5 then return end

Regra 4: o servidor decide os valores

Nunca aceite do cliente: preço, recompensa, dano, quantidade de dinheiro. O cliente diz "concluí a entrega"; o servidor verifica e decide quanto pagar.

Regra 5: limite a frequência

local ultimo = {}
if ultimo[client] and getTickCount() - ultimo[client] < 1000 then return end
ultimo[client] = getTickCount()

Limpe a tabela no onPlayerQuit.

Regra 6: registre anomalias

Quando uma validação falhar de um jeito que só um cliente modificado causaria (ex.: client ~= source, quantidade negativa), registre:

outputServerLog(("[SUSPEITO] %s (%s) evento=%s arg=%s"):format(
    getPlayerName(client), getPlayerSerial(client), eventName, tostring(item)))

Esses logs ajudam a identificar e banir trapaceiros.

Regra 7: element data protegida

Não confie em element data sincronizada para valores importantes — ela pode ser alterada pelo cliente se não for protegida. Veja "Element data: quando usar e quando evitar".

Revise o código antigo

Procure por todos os addEvent(..., true) do seu servidor e revise cada handler com estas regras.

Hospede seu servidor com a VittHost

No MTASA-BR da VittHost, seus sistemas protegidos rodam em servidores no Brasil com proteção DDoS, painel Pterodactyl, MySQL incluso para logs, 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