Основы защиты от читов FiveM: что делать и что не может сделать ни одна защита
Основы защиты от читов для FiveM: проверка на сервере сначала, пределы сущностей OneSync, отмена взрывов, журналы Discord webhook, запреты txAdmin и что не может сделать ни одна защита.
Читеры — часть запуска публичного сервера. Они спавнят транспортные средства, взрывают карту, дают себе деньги и оружие и забирают ваших честных игроков. Один ресурс "защиты от читов" этого не исправит. Что работает, так это несколько слоев, начиная с наиболее важного: не доверяйте клиенту.
Слой 1: валидация на сервере
Большинство читов на сервере ролевой игры — не взломы движка. Это кто-то вызывает ваши собственные события с выбранными ими значениями. Исправьте это сначала, и большая часть проблемы исчезнет.
- Вычисляйте цены, награды и количества на сервере.
- Используйте
source, никогда не id игрока, отправленную клиентом. - Проверьте работу, расстояние и кулдауны перед действием.
Полный метод с кодом находится в securing server events. Если вы сделаете только одно из этой статьи, делайте это.
Слой 2: контроль сущностей с OneSync
С OneSync сервер знает о сущностях (транспортные средства, педы, объекты) и может контролировать, кто их создает. Это позволяет вам остановить читеров от спавна вещей.
- Блокировка сущностей. OneSync имеет режим блокировки сущностей, при котором сущности, созданные клиентом, блокируются или ограничиваются. Это сильно, но это ломает любой скрипт, который спавнит транспортные средства или объекты с клиента. Прочитайте документацию OneSync для точного параметра в вашей сборке перед включением, и переместите спавн на сервер сначала. Смотрите spawning vehicles server-side.
- Событие
entityCreating. Сервер может проверять сущности при их создании и отменять те, которые вы не хотите.
AddEventHandler('entityCreating', function(entity)
local model = GetEntityModel(entity)
if model == `jet` then
CancelEvent()
end
end)Этот пример отказывается создавать реактивный самолет откуда-либо. Создайте свой собственный список моделей, которых никто на вашем сервере не должен создавать, и будьте осторожны: правило, которое слишком широко, отменяет сущности ваших собственных скриптов.
OneSync должен быть включен для этих функций. Смотрите OneSync and player limits.
Слой 3: обработка событий игры
FiveM отправляет некоторые игровые действия на сервер как события, и сервер может их отменять. Два распространенных:
Взрывы
AddEventHandler('explosionEvent', function(sender, ev)
-- sender is the player who caused the explosion
-- ev holds the explosion type and position
CancelEvent()
end)Отмена каждого взрыва также остановит гранаты и ваши собственные скриптовые взрывы. Сузьте это с помощью данных в ev. Например, посмотрите на ev.explosionType и только отмените типы, которые никогда не должны происходить на вашем сервере, или сначала запишите их, чтобы увидеть, что производит нормальная игра.
local blocked = { [1] = true } -- example: replace with the types you decide to block
AddEventHandler('explosionEvent', function(sender, ev)
if blocked[ev.explosionType] then
CancelEvent()
print(('Blocked explosion from player %s'):format(sender))
end
end)Оружие
Сервер также получает события для выдачи, удаления и стрельбы оружием, такие как giveWeaponEvent. Читеры, которые дают себе оружие, срабатывают эти события. Если ваш инвентарь обрабатывает оружие, сравните то, что событие хочет дать, с тем, что имеет игрок, и отмените его, когда это не совпадает. Сначала логируйте, потом применяйте, чтобы вы не заблокировали реальных игроков случайно.
Другие события игры существуют для огня, снарядов и урона от оружия. Посмотрите их в документации Cfx перед использованием и протестируйте на сервере разработки.
Внимание: обработчик события игры, который слишком строгий, наказывает честных игроков. Начните в режиме только логирования на несколько дней, прочитайте журналы, а затем применяйте.
Слой 4: логирование подозрительного поведения
Не баньте на один сигнал. Логируйте, прочитайте, затем действуйте. Discord webhook — легкое место для отправки журналов, которые персонал может видеть.
local WEBHOOK = GetConvar('anticheat_webhook', '')
local function logToDiscord(text)
if WEBHOOK == '' then return end
PerformHttpRequest(WEBHOOK, function() end, 'POST',
json.encode({ username = 'Anticheat', content = text }),
{ ['Content-Type'] = 'application/json' })
end
AddEventHandler('explosionEvent', function(sender, ev)
logToDiscord(('Explosion from %s (%s), type %s'):format(GetPlayerName(sender), sender, ev.explosionType))
end)Установите URL webhook в server.cfg с помощью set anticheat_webhook "https://...", а не в скрипте, и держите его в секрете. Любой с URL может отправить на ваш канал.
Что логировать: неудачные проверки на сервере (невозможные количества, неправильное расстояние), заблокированные взрывы, спавны сущностей, которые вы отменили, повторное спамирование событий. Включите имя игрока, идентификатор сервера и идентификатор, такой как лицензия, чтобы вы могли их заблокировать.
Слой 5: действие с txAdmin
Когда журналы показывают читера, удалите их. Используйте txAdmin для предупреждения или запрета, поэтому действие записывается и выживает перезагрузки. Смотрите moderating with txAdmin. В скрипте DropPlayer(source, 'reason') выбрасывает игрока, но запрет должен пройти через ваши инструменты модерации, поэтому идентификаторы сохраняются.
Что не может сделать ни одна защита от читов
Будьте честны о пределах.
- Клиент принадлежит читеру. Все, что проверяется только на клиенте, можно отключить. Только проверки на сервере надежны.
- Никакой инструмент не ловит все. Новые читы появляются, и обнаружение всегда отстает на шаг.
- Обфускация — это не безопасность. Скрытые имена событий и "секретные" токены в коде клиента можно прочитать.
- Бесплатный или утекший код защиты от читов — риск. Разработчики читов это тоже читают, и некоторое из этого содержит бэкдоры. Будьте осторожны с ресурсами из неизвестных источников.
- Люди все еще важны. Активный персонал, четкая система отчетности и быстрые запреты делают больше, чем любой скрипт.
Объедините слои, держите ресурсы в актуальном состоянии и просматривайте свои журналы. Это делает ваш сервер сложной целью по сравнению с другими.
Контрольный список
| Симптом | Исправление |
|---|---|
| Игроки получают бесплатные деньги или предметы | Валидируйте события на сервере, смотрите руководство событий |
| Читеры спавнят транспортные средства и объекты | Контроли сущностей OneSync и entityCreating; переместите спавн на сервер |
| Взрывы по всей карте | Обработчик explosionEvent с CancelEvent, сужение по типу |
| Читы на выдачу оружия | Проверьте события оружия против вашего инвентаря, сначала логируйте |
| Не знаю, что делают читеры | Отправляйте журналы в Discord webhook, сохраненный в convar |
| Читер найден | Запретите с txAdmin с сохраненными идентификаторами |
| Правило блокирует честных игроков | Переключитесь на только-логирование и сузьте условие |
Короткие ответы
Нужна ли мне ресурс защиты от читов?
Сначала защитите свои собственные скрипты, потому что это останавливает наиболее распространенное злоупотребление. Ресурс защиты от читов может добавить обнаружение поверх, но это не замена валидации на сервере.
Может ли защита от читов остановить каждого читера?
Нет. Читеры адаптируются, и клиент игры находится на их машине. Цель — сделать читерство сложным, обнаружить очевидное и быстро удалить нарушителей.
Безопасно ли отменять события игры на сервере?
Да, с осторожностью. Отмена события останавливает его для всех, поэтому протестируйте, что нормальный игровой процесс, такой как ваши собственные скрипты, которые создают взрывы, все еще работает перед запуском правила на живом сервере.
Скрипты без этой проблемы
CCTV Security CamerasУстанавливаемые камеры, планшет с мультиэкраном в реальном времени и распечатанные фото-улики.Смотреть скрипт →
Shop CreatorМагазин меньше чем за минуту — владельцы, сотрудники, сейфы и ограбления в комплекте.Смотреть скрипт →
Tebex TemplateПремиальная тема для вашего магазина Tebex без кода, полностью настраиваемая из панели Tebex.Смотреть скрипт →