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.