How do you secure server-side triggers from mod menus? Mod menus let cheaters fire TriggerServerEvent and spoof client data. The fix is never trust the client: every server handler must validate who called it (source), whether they are allowed (job, item, permission), where they are (distance/zone), and how often (rate limits). Money, items, and weapons must change only on the server after checks pass. RAX Development hardens custom and leaked scripts for QBCore and ESX servers.
Quick answer: Audit every RegisterNetEvent / RegisterServerEvent handler. Validate source, permissions, distance, inventory, and cooldowns on the server. Prefer lib.callback (ox_lib) over open events. Use anti-cheat as a layer, not your only defense. Need a security pass? Request an audit · Custom scripts
What mod menus exploit
- Unprotected server events — Handlers that give cash/items with no checks
- Client-authoritative logic — Server believes a client-sent amount, plate, or target ID
- Leaked Tebex scripts — Event names are public; cheaters spam known triggers
- Missing distance checks — Robbery/shop events fired from across the map
- No rate limits — Same event fired hundreds of times per second
Anti-cheat can block some menus, but secure Lua is what stops economy exploits when a cheater gets through.
Core rules (server-side only)
- Validate
source — Resolve the player; reject if nil or not fully loaded
- Re-check state on server — Job, gang, duty, dead, cuffed, in vehicle — from server exports, not client args
- Re-check inventory on server — Required item/count via ox_inventory / qb-inventory server APIs
- Distance / zone — Compare player coords to shop vault, door, or target entity server-side
- Cooldowns & tokens — Per-player throttle; one-time tokens for sensitive actions
- Log and ban patterns — Repeated failed validations = exploit attempt
Secure patterns vs insecure patterns
| Pattern |
Risk |
Better approach |
TriggerServerEvent('giveMoney', 999999) | Mod menu spams amount | Server reads job payout table; amount never from client |
Open RegisterNetEvent with no checks | Anyone triggers it | Validate + rate limit; or use lib.callback.register |
| Client removes item then tells server | Client can skip removal | Server removes item, then grants reward |
| Client picks target player ID | Teleport loot to arbitrary IDs | Server validates target in range and line-of-sight rules |
| Obfuscated leaked script | Known exploit events | Replace with custom from scratch or professional audit |
Example: hardened server event (Lua)
Illustrative pattern — adapt to your framework exports:
local cooldown = {}
RegisterNetEvent('myresource:server:completeDelivery', function()
local src = source
if not src or src < 1 then return end
local now = os.time()
if cooldown[src] and now - cooldown[src] < 5 then return end
cooldown[src] = now
local ped = GetPlayerPed(src)
if not ped or ped == 0 then return end
local Player = QBCore.Functions.GetPlayer(src) -- or ESX equivalent
if not Player or Player.PlayerData.job.name ~= 'trucker' then return end
local coords = GetEntityCoords(ped)
local depot = vector3(123.0, 456.0, 78.0)
if #(coords - depot) > 10.0 then return end
-- Server decides payout
Player.Functions.AddMoney('bank', 250, 'trucker-delivery')
end)
Notice: no payment amount from the client, job verified server-side, distance checked server-side, cooldown applied.
Use callbacks instead of open events
ox_lib callbacks (lib.callback.register / lib.callback.await) still require server validation, but reduce random event spam and clarify request/response flow. For sensitive actions (open stash, craft item, start heist), register a callback, run all checks server-side, then return success/fail only.
Rate limiting and exploit logging
- Per-
source counters per event name (reset every N seconds)
- Drop silently or kick after repeated invalid calls
- Discord webhook for admin alerts on high-value failures
- Correlate with anti-cheat bans — don't rely on AC alone
Audit checklist for your resources
- Grep all
RegisterNetEvent / RegisterServerEvent in server/*.lua
- Flag any handler that adds money/items/weapons from client parameters
- Confirm shop/robbery scripts validate coords and required items server-side
- Remove debug events left in production (
giveItem, admin without ACE)
- Update leaked scripts or replace with maintained custom exclusive code
- Test with a staging server and intentional exploit attempts before public launch — launch timeline
Anti-cheat vs secure scripts
Anti-cheat (commercial or built-in) blocks many mod menus and executors. It does not replace bad Lua: if your server event gives $50k with no checks, a bypassed menu still wins. Use both — AC for client integrity, server validation for economy integrity. Performance tuning also matters: heavy client loops help cheaters hide — see script optimization.
How RAX Development helps
- Security audit of high-risk resources (shops, banking, drugs, admin tools)
- Harden existing scripts or rewrite exploit-prone events from scratch
- Custom secure scripts from $49 — built with validation from day one
- Server builds with audited core loop before launch — from $99
- Dev standby for post-launch exploit reports — from $199/mo
US Navy Veteran, 13 years IT. Reviews · Contact
Related: High ping scripts ·
Client spawn & routing ·
Discord staff webhooks ·
SQL injection protection ·
Custom Lua from scratch ·
Server performance ·
Before starting a community
Conclusion
How do you secure server-side triggers from mod menus? Validate every server event on the server: player, permissions, distance, inventory, and rate limits. Never send reward amounts from the client. RAX Development audits and writes secure Lua for FiveM servers — request a security pass or order custom scripts built safe from day one.