StatebagNieuws, scripts en anticheat reviews voor FiveM
Achtergrond

Je server dichttimmeren zonder alles te breken: entity lockdown, request control en server-side checks

Een anticheat is je tweede verdedigingslinie. De eerste is gratis: een handvol convars en de gouden regel "vertrouw nooit de client".

Elke week vraagt iemand op het forum welke anticheat de beste is. Dat is een goede vraag, maar meestal de tweede. De eerste vraag is: wat kan een cheater op jouw server doen zonder dat een anticheat er iets aan kan veranderen? Het antwoord: alles wat je scripts en je config hem toestaan.

1. Beperk wat clients mogen maken

Met sv_entityLockdown bepaal je of clients zelf genetwerkte entities mogen aanmaken:

  • inactive: clients mogen alles maken (het onveilige uitgangspunt);
  • relaxed: entities die door scripts aan de clientkant worden gemaakt, worden geblokkeerd;
  • strict: clients mogen helemaal geen entities maken. Alles moet via de server.

Per routing bucket kun je een andere modus instellen. Volgens de docs over wat er verandert in FiveM voor GTA V Enhanced komt daar een modus bij die ook dummy objects uitschakelt. sv_protectServerEntities wordt op Enhanced niet geïmplementeerd: gebruik daar dus sv_entityLockdown.

Waarom niet meteen strict?Veel scripts van derden maken entities aan de clientkant (props, voertuigen, peds). In strict mode breken die. Begin met relaxed, kijk in je console wat er geblokkeerd wordt en herschrijf daarna.

Ook relaxed is niet waterdicht. In een forumtopic over cheaters die entities als poptype 5 aanmaken beschrijven owners hoe cheaters voertuigen en peds spawnen die zich voordoen als "population"-entities, die relaxed niet tegenhoudt.

2. Filter "request control"

Cheats nemen graag de controle over andermans voertuig of entity over. sv_filterRequestControl regelt hoe streng de server zulke verzoeken filtert. Hoe hoger de waarde, hoe strenger. De hoogste stand stuurt verzoeken om controle helemaal niet meer door. Ook hier geldt dat een hoge stand scripts kan breken die daarop rekenen. Check de server-commands-documentatie voor de exacte betekenis per waarde.

3. Een startpunt voor je server.cfg

server.cfg# Clients mogen geen script-entities maken
sv_entityLockdown relaxed

# Strenger filteren op het overnemen van entities
sv_filterRequestControl 2

# Geen genetwerkte geluiden (tegen sirene-spam)
sv_enableNetworkedSounds false

# Blokkeer aangepaste clientbestanden.
# Let op: dit blokkeert ook graphics- en soundpacks van spelers.
sv_pureLevel 1

Test dit altijd eerst op een dev-server. In de populaire forumgids "How to protect your server from MOST cheaters" waarschuwt een reageerder terecht: veel owners voegen dit soort instellingen toe zonder te snappen wat ze breken.

4. Vertrouw nooit de client

Dit is de belangrijkste regel, en de reden dat zoveel servers ondanks een dure anticheat toch geld- en itemexploits hebben. Een cheater kan elk event aanroepen dat jouw client-scripts kunnen aanroepen, met elke waarde die hij wil.

lua-- ❌ De client bepaalt hoeveel geld hij krijgt
RegisterNetEvent('job:reward', function(amount)
  local xPlayer = ESX.GetPlayerFromId(source)
  xPlayer.addMoney(amount)
end)

-- ✅ De server bepaalt én controleert
local REWARD, MAX_DIST, COOLDOWN = 250, 5.0, 60
local JOB_POS = vec3(-1037.5, -2737.6, 20.2)
local lastDone = {}

RegisterNetEvent('job:complete', function()
  local src = source
  local coords = GetEntityCoords(GetPlayerPed(src))
  if #(coords - JOB_POS) > MAX_DIST then return end
  if lastDone[src] and os.time() - lastDone[src] < COOLDOWN then return end
  lastDone[src] = os.time()
  ESX.GetPlayerFromId(src).addMoney(REWARD)
end)

Het verschil: in het tweede voorbeeld kan de client alleen zeggen "ik ben klaar". De server checkt of dat klopt (positie en cooldown) en bepaalt zelf het bedrag. Doe hetzelfde voor items, voertuigen en permissies.

5. Encryptie is geen beveiliging

In hetzelfde forumtopic ontstond een discussie over het versleutelen van clientscripts. De conclusie van meerdere ervaren developers: clientcode is uiteindelijk altijd leesbaar. Versleuteling houdt hooguit beginnende scriptkiddies even tegen en kost performance. Je tijd is beter besteed aan server-side validatie.

Checklist

  1. Zet sv_entityLockdown op minimaal relaxed en los op wat breekt.
  2. Stel sv_filterRequestControl in en test je voertuigscripts.
  3. Loop al je RegisterNetEvent-handlers langs: welke vertrouwen een waarde van de client?
  4. Log economie- en adminacties, zodat je exploits achteraf kunt terugvinden.
  5. Draai geen gelekte of "nulled" scripts: daar zitten regelmatig backdoors in.
  6. Kies pas dán een anticheat.