Parent : [[INDEX-CYBERSECU]]
FiveM - Anti-Cheat Dispatch : banned words, job whitelist, speed traps, gunshot alerts
Problème
Les systèmes de dispatch (alertes policières, appels 911) sont vulnérables au spam, au spoofing de job, et aux messages malveillants contenant des liens ou insultes.
Solution
Filtrage multi-couches dans le système dispatch :
- Banned words : liste de mots interdits dans les messages
- AllowedJobsOnly : seuls les jobs whitelistés peuvent envoyer certaines alertes
- Speed traps : zones configurables avec limite de vitesse et amende automatique
- Gunshot alerts : zones whitelistées (stand de tir) et armes whitelistées (taser, flare)
Config.AntiCheat = {
ENABLE = true,
AllowedJobsOnly = { ENABLE = true },
BannedWords = {
'http', 'https', 'discord', '.gg', 'fuck', 'shit',
'nigger', 'bitch', 'www.', '.com', '.fr'
}
}
Config.PoliceAlerts = {
GunShots = {
WhitelistedZones = {
{ coords = vector3(13.98, -1098.05, 29.8), distance = 20 } -- Stand de tir
},
WhitelistedWeapons = {
[`WEAPON_FLARE`] = true,
[`WEAPON_STUNGUN`] = true
}
},
SpeedTrap = {
Locations = {
{
coords = vector3(-2589.0, 1911.0, 167.0),
distance = 9,
speed_limit = 150, -- km/h
fine_amount = 500
}
}
}
}
-- Filtrage des messages
function FilterMessage(message)
if not Config.AntiCheat.ENABLE then return true end
local lowerMsg = message:lower()
for _, word in ipairs(Config.AntiCheat.BannedWords) do
if lowerMsg:find(word) then
return false, 'Message contient un mot interdit'
end
end
return true
end
-- Validation job pour les alertes
function CanSendAlert(source, alertType)
if not Config.AntiCheat.AllowedJobsOnly.ENABLE then return true end
local xPlayer = ESX.GetPlayerFromId(source)
local allowedJobs = Config.AlertPermissions[alertType] or {}
for _, job in ipairs(allowedJobs) do
if xPlayer.job.name == job then return true end
end
return false
end
Pourquoi
- Le filtrage de mots empêche le spam et les liens malveillants dans les appels 911
- La whitelist de job empêche les civils de spoof des alertes policières
- Speed trap et gunshot alerts automatisés réduisent la charge des joueurs policiers
Quand l'utiliser
- Systèmes de dispatch (police, EMS, mécanicien)
- Chat global ou channels restreints
- Systèmes de rapport automatique (accidents, vols)
Quand NE PAS l'utiliser
- Communications privées (téléphone, SMS) où la censure n'est pas souhaitée
- Si le filtrage est trop agressif et génère des faux positifs
Exemples
Correct
-- Dispatch alert avec validation complète
RegisterNetEvent('dispatch:sendAlert')
AddEventHandler('dispatch:sendAlert', function(alertType, message, coords)
local src = source
if not CanSendAlert(src, alertType) then
LogSuspicious(src, 'alert_spoof', alertType)
return
end
local valid, reason = FilterMessage(message)
if not valid then
TriggerClientEvent('dispatch:notify', src, reason)
return
end
BroadcastAlert(alertType, message, coords)
end)
Incorrect
-- Pas de validation du job → n'importe qui peut envoyer des alertes policières
RegisterNetEvent('dispatch:alertPolice')
AddEventHandler('dispatch:alertPolice', function(msg)
TriggerClientEvent('dispatch:show', -1, msg) -- Tout le monde reçoit
end)
Références
- cd_dispatch/config.lua L50-60, L248-299
Liens connexes
- [[KNOW-ANT-FIVEM-002-client-side-validation-only|KNOW-ANT-FIVEM-002]]