Cheats ermöglichen es bösartigen Clients, Events in jedem Kontext auszulösen. Erfahren Sie, wie Sie die Client-Server-Kommunikation sichern, serverseitige Validierung implementieren und FXServer-Sicherheitsconvars konfigurieren.
Das Anti-Cheat-Team versucht immer, das Anti-Cheat zu verbessern, aber manchmal schlüpfen Dinge durch.
In dieser Anleitung versuchen wir, einige gängige Praktiken zu vermitteln, mit denen Sie Ihren Server sicherer machen können, indem Sie Ihre Events richtig absichern.
Cheats können es dem Client ermöglichen, Events in jedem Kontext auszulösen.
Mit Kontext meinen wir, dass sie Client->Server (über TriggerServerEvent) oder Client-Ressource->Client-Ressource (über TriggerEvent) ausführen können.
Bei der Arbeit mit Events in Lua ist es entscheidend, diese korrekt zu registrieren, je nachdem, ob sie vom Client oder vom Server aufgerufen werden.
Ein häufiger Fehler ist das Registrieren von Server-Events, die nicht vom Client aufgerufen werden sollten, oder umgekehrt, was zu schwerwiegenden Sicherheitslücken führen kann.
Verwenden Sie AddEventHandler, wenn das Event im selben Kontext ausgelöst werden soll, entweder Client-Client oder Server-Server. Dies stellt sicher, dass die Events nicht vernetzt sind und nicht von der Gegenseite aufgerufen werden können.
AddEventHandler("eventName", function(eventParam1, eventParam2)
-- Der Code hier wird ausgeführt, sobald das Event im selben Kontext ausgelöst wird.
end)Verwenden Sie RegisterNetEvent, wenn das Event über verschiedene Kontexte hinweg ausgelöst werden muss, z. B. vom Client zum Server oder vom Server zum Client.
RegisterNetEvent("eventName", function(eventParam1, eventParam2)
-- Der Code hier wird ausgeführt, sobald das Event über verschiedene Kontexte hinweg ausgelöst wird.
end)Dieses Beispiel ist für den Client, und wie alles auf dem Client ist es nicht absolut sicher und kann von cheatenden Clients manipuliert werden.
Wenn Sie die Ausführung aus demselben Kontext blockieren möchten (z. B. um zu verhindern, dass ein Server-zu-Server-Netzwerk-Event vom Client ausgelöst wird), sollten Sie Ihr Event registrieren und die Absenderquelle überprüfen:
RegisterNetEvent("eventName", function(eventParam1, eventParam2)
-- Der Server sendet die Netz-ID `65535` für Events vom Server
if source ~= 65535 then return end
end)Selbst wenn Sie ein starkes Anti-Cheat-System aufbauen, macht das Hinzufügen von Prüfungen bei Server-Events diese erheblich sicherer. Dies ist eine dringend empfohlene Praxis, obwohl sie nicht alles verhindert. Unten teilen wir einige gute Tipps.
Dies gewährleistet die Integrität und Sicherheit Ihrer Spielumgebung.
Alle folgenden Beispiele setzen eine Art Framework voraus (wie ESX, QB-Core usw.).
Dies soll Ihnen schlechte Wege zur Handhabung von Events zeigen. Sie sollten dies niemals tun. Das direkte Hinzufügen von Gegenständen für den Benutzer aus seiner eigenen Eingabe ist immer eine schlechte Praxis: Sie sollten Benutzereingaben immer validieren.
RegisterNetEvent("job:givePlayerItem", function(item, count)
local ply = FX.GetPlayerFromSource(source)
-- Direktes Hinzufügen von Gegenständen für den Benutzer aus seiner eigenen Eingabe ist unsicher!
ply.addItem(item, count)
end)Hier ist ein robustes Sicherheitsmuster. Der Server verfolgt den Spielerstatus und die Koordinaten und überprüft Aktionen mithilfe von serverseitigen Ticks, anstatt sich ausschließlich auf Client-Trigger zu verlassen.
-- zufällige Koordinate
local VALID_JOB_COORD = vector3(125.0, 111.1, 35.83)
local MAX_ITEM_COUNT = 10
-- zufällige Koordinate
local VALID_TURNIN_COORD = vector3(1888.0, 1254.1, 48.0)
local ITEM_NAME = 'log'
-- Liste der Spieler mit aktiven Jobs
local activeJobs = {}
AddEventHandler("playerDropped", function ()
if not activeJobs[source] then return end
activeJobs[source] = nil
end)
function isPedWithinRange(ped, tgtCoords)
return #(GetEntityCoords(ped) - tgtCoords) < 15.0
end
-- Serverseitige Erhöhung der Gegenstandsmenge verarbeiten
CreateThread(function()
while true do
for src, data in pairs(activeJobs) do
local ped = GetPlayerPed(src)
-- wenn sie nicht in Reichweite sind, wollen wir ihnen den Gegenstand nicht geben
if isPedWithinRange(ped, VALID_JOB_COORD) then
-- gib ihnen den Gegenstand, aber begrenze ihn auf MAX_ITEM_COUNT
data.itemCount = math.min(data.itemCount + 1, MAX_ITEM_COUNT)
end
end
-- Job-Tick einmal pro Sekunde verarbeiten
Wait(1000)
end
end)
RegisterNetEvent("job:startJob", function()
local ped = GetPlayerPed(source)
-- wenn sie innerhalb von 15 Einheiten sind, machen sie den Job
if isPedWithinRange(ped, VALID_JOB_COORD) then
activeJobs[source] = {
itemCount = 0,
}
end
end)
RegisterNetEvent("job:givePlayerItem", function()
local ply = FX.GetPlayerFromSource(source)
-- wenn sie keinen aktiven Job haben, sollten sie dies nicht aufrufen!
local jobData = activeJobs[source]
if not jobData then return end
local ped = GetPlayerPed(source)
-- sie sind nicht in Reichweite der Abgabekoordinaten, lehne ihre Änderungen ab
if not isPedWithinRange(ped, VALID_TURNIN_COORD) then return end
-- setze die Gegenstandsdaten zurück, damit sie das Event nicht mehrfach auslösen können
activeJobs[source] = nil
-- Füge dem Benutzer Gegenstände hinzu, die serverseitig validiert wurden
ply.addItem(ITEM_NAME, jobData.itemCount)
end)Bitte beachten Sie, dass die folgenden Einstellungen nicht geändert werden sollten, es sei denn, Sie wissen genau, was Sie tun. Das Cfx.re / Adhesive-Team arbeitet immer sehr hart daran, Cheater zu verhindern. Die meisten dieser Funktionen sind ab FXServer-Buildversion 8450 und höher standardmäßig aktiviert.
Wenn diese Convars aktiv sind, wird der Spieler wahrscheinlich mit folgendem Grund gekickt: Connection to CNL timed out.
Ein Kick bedeutet nicht, dass der Spieler automatisch global gebannt (Global Banned) ist. Es liefert jedoch einen starken Hinweis auf die Zuverlässigkeit des Spielers, was für die Beurteilung der Vertrauenswürdigkeit äußerst nützlich ist.
Die bereitgestellten Codes sind nicht dafür gedacht, einfach kopiert und eingefügt zu werden. Dies sind nur einige Tipps, um bestimmte Aktionen zu verhindern, die auf dem Server auftreten könnten. Dies erfordert Programmierkenntnisse. Es steht Ihnen jederzeit frei, unserem Discord beizutreten, um zusätzliche Hilfe zu erhalten.