Explorer
KNOW-PAT-091

FiveM - Anti-Cheat Dispatch : banned words, job whitelist, speed traps, gunshot alerts

Domaine
cybersecu
Type
pattern
Priorité
P1

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 :

  1. Banned words : liste de mots interdits dans les messages
  2. AllowedJobsOnly : seuls les jobs whitelistés peuvent envoyer certaines alertes
  3. Speed traps : zones configurables avec limite de vitesse et amende automatique
  4. 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]]