← База знаний
Безопасность

Безопасная работа с net-сообщениями

Ограничения, валидация данных и защита серверных обработчиков от злоупотреблений.

Регистрация и отправка

Сеть регистрируется на сервере один раз:

if SERVER then
    util.AddNetworkString("GML_RequestAction")
end

Клиент может отправить любое зарегистрированное сообщение вручную. Поэтому net.Receive — это публичная точка входа, а не доверенный вызов интерфейса.

Серверная проверка

net.Receive("GML_RequestAction", function(_, ply)
    if not IsValid(ply) or not ply:Alive() then return end
    if (ply.GMLNextAction or 0) > CurTime() then return end
    ply.GMLNextAction = CurTime() + 1

    local target = net.ReadEntity()
    if not IsValid(target) then return end
    if ply:GetPos():DistToSqr(target:GetPos()) > 160000 then return end

    -- действие выполняется только после всех проверок
end)

Проверяйте тип, диапазон, длину строки, существование сущности, расстояние, роль игрока, кулдаун и текущее состояние. Не принимайте от клиента SQL, имя функции, путь файла или готовую сумму операции.

Ограничивайте трафик

Не отправляйте большие таблицы каждый кадр. Передавайте только изменившиеся данные, задавайте разумные лимиты и не используйте net.WriteTable для сложных неограниченных структур.