Неограниченные входящие HTTP-тела — самый дешёвый вектор атаки на бюджет LLM-шлюза: один многомегабайтный JSON заставляет токенайзер обработать мегатокены до того, как сработает ваш слой валидации JSON Schema. В 2026 году явно задайте на периметре OpenClaw максимальный размер сущности, потолок глубины разбора JSON и лимиты stdout на инструмент, синхронизировав числа с теми же манифестами, что читает валидатор. Свяжите лимиты с порогами из статьи circuit breaker для нестабильных upstream-инструментов, чтобы повторные нарушения вызывали защитный backoff, а не тихое насыщение CPU.
Здесь приведены ориентиры для постмортемов: по умолчанию 4 МиБ входящего JSON для интерактивных сессий, глубина 32 для вложенных объектов без явных исключений в манифестах инструментов, 512 КиБ превью чтения файловой системы без повышенного контракта, и бюджет репетиции порядка 16,9 $/сутки на арендованном Mac mini с Apple Silicon.
Зачем шлюзу отклонять запросы как можно раньше
Defense-in-depth складывает TLS, обратные прокси и прикладные парсеры — но как только перегруженный payload доходит до токенайзера, энергия и бюджет задержки уже потрачены. Ограничения размера на уровне сокета с консервативными ридерами гарантируют, что злоумышленник платит в основном за round-trip, не занимая слоты модели. Разделяйте причины отказа и шум HTTP 502 от upstream, чтобы плитки Grafana оставались читаемыми в инциденте.
Операторам нужен общий язык: стабильные коды error, задокументированные лимиты и runbook с теми же именами переменных, что в Terraform и plist LaunchAgent. Без дисциплины staging и production расходятся еженедельно, путая интеграторов.
Ранний отказ защищает не только GPU-циклы, но и внимание людей: дежурные быстрее видят злоупотребления, когда всплески 413 отделимы от падений upstream и коррелируют с API-ключами.
HTTP-тело и потолки Content-Length
Обрывайте запросы, у которых Content-Length превышает политику, до стриминга остатка; для chunked без длины накапливайте в кольцевой буфер и останавливайтесь после 4 194 304 байт для интерактивных каналов. Большие лимиты документируйте только для batch-импорта с отдельной аутентификацией и метриками глубины очереди.
| Канал | Макс. тело | Обоснование |
|---|---|---|
| Интерактивный чат | 4 МиБ | Богатый JSON инструментов без дампов архивов |
| Webhook автоматизации | 16 МиБ | Пакеты событий с одобрением админа |
| Операторский override | 64 МиБ | Подписанный заголовок и запись аудита |
nginx и другие reverse proxy должны знать те же лимиты, чтобы не было расхождения между обрывом на L4 и L7. Явно укажите, какой компонент отвечает первым, чтобы клиенты не видели противоречий между 413 и 502.
Глубина JSON, длина массивов и число ключей
Парсеры должны отклонять деревья глубже 32 уровней или шире 4096 элементов массива на узел без исключения в версионируемых манифестах. Добавьте лимит уникальных ключей в объекте (256) против конфигурационных blob, замаскированных под гаджеты prototype pollution.
{
"error": "parse_depth_exceeded",
"limit_depth": 32,
"observed_depth": 41,
"request_id": "b7f2…",
"hint": "Упростите вложенность или разбейте вызовы инструментов"
}
Тексты ошибок держите короткими и машиночитаемыми; человеческие пояснения — в документации, не в каждом поле JSON, чтобы логи оставались компактными.
Вывод инструментов, усечение и стриминг
Файловые и shell-инструменты могут случайно выдать мегабайты stdout. Оборачивайте pipe подпроцессов ридерами, которые после 524 288 байт переходят в режим отбрасывания, если инструмент не объявил large_output:true. При стриминге токенов модели вверх учитывайте давление TCP-окна: приостанавливайте чтение инструмента, когда внутренние очереди на шлюзе Mac mini 8 ГиБ превышают 2 МиБ RAM на воркера суммарно.
Стриминг требует явной семантики «частично доставлено»: флаги вроде truncated:true, чтобы модель не фантазировала полный каталог. Документируйте пагинацию и вторичные эндпоинты.
Для длительных задач предпочитайте URL загрузки или объектное хранилище вместо inline Base64, которое раздувает тело и ухудшает все три класса лимитов сразу.
Структурированные тела ошибок для 413 и 400
Используйте стабильные коды error, отражайте лимиты политики, не эхойте управляемые злоумышленником строки длиннее 200 UTF-8 символов. retry_after_ms добавляйте только при перегрузке, не при злоупотреблении.
HTTP 400 должен отличать ошибки разбора от семантических нарушений: сломанный JSON против отказов, которые сообщает ваша цепочка JSON Schema. Не смешивайте пути оптимизации.
Согласование с манифестами схемы
Если шлюз уже валидирует аргументы через JSON Schema, maxLength и maxItems должны быть не мягче транспортных потолков — клиенты увидят ошибки схемы вместо непрозрачных сбросов сокета. CI может сравнивать манифесты с переменными окружения шлюза.
Версионируйте манифесты и сборки шлюза вместе: semver без синхронных лимитов часто вызывает внезапные бури 413 после деплоев, которые должны были менять только маршрутизацию модели.
Буферы macOS, pipe и LaunchAgent
launchd наследует иные размеры pipe, чем типичные Linux-контейнеры; репетиция на «голом» macOS показывает stdout, заполняющийся быстрее, чем горутины успевают сливать — это заставляет честно калибровать high-water mark до продакшена. StandardOutPath при высокой частоте записи может стать I/O-узким местом.
Термика Apple Silicon влияет на устойчивую нагрузку парсера: ядро может снижать частоты; SLO нужны на worst-case, а не только на короткие бенчмарки на холодном кристалле.
Злоупотребления и смежные с лимитами контролы
Атаки редко приходят одним гигантским POST — чаще тысячи запросов чуть ниже лимита, всё равно истощающие парсеры. Измеряйте rejection_rate_413 и rejection_rate_parse как первоклассные метрики: предупреждение при 5 % за пять минут, автоматическое токен-дросселирование при 20 % для ключа. Свяжите с балансами мультитенантности, чтобы маркетинг не голодал платформенные ops.
Форензика: логируйте сэмплы, но не целые отклонённые тела — SHA-256 и максимум 1024 первых байт в отдельном зашифрованном хранилище с TTL 72 часа без legal hold.
Когда срабатывают half-open пробы circuit breaker, коррелируйте с статистикой payload: иногда виноват не upstream, а клиент со спамом синтаксически валидных монструозных JSON.
Таблица SLO для решений по лимитерам
| Сигнал | Цель | Действие |
|---|---|---|
| Медиана времени разбора | < 3 мс на M4 для 16 КиБ JSON | Алерт если > 6 мс 15 минут |
| Доля 413 | < 0,3 % в штате | Pager если > 2 % после релиза |
| Усечённые строки инструментов | < 1 % вызовов | Запросить пагинацию у владельцев |
Последовательность выката для осторожных команд
- Теневой режим: 48 часов только логировать «что было бы отклонено».
- Канареечные тенанты: сначала внутренние workspace.
- Постепенное ужесточение: снижать интерактивный максимум тела с 8 МиБ до 4 МиБ еженедельными релизами.
- Пост-деплой: сравнить дельты Prometheus с базовой CPU.
Документируйте дефолты рядом с переменными окружения, чтобы Terraform и LaunchAgent plist не расходились — доверие разрушается, когда staging принимает то, что production отвергает.
WebAssembly и нативные пути расширения
Некоторые команды выносят разбор JSON в WASM или SIMD-библиотеки. Потолки шлюза должны быть ниже пиковых обещаний ускорителей — Apple Silicon троттлит под нагревом. Сравнивайте холодный и тёплый кэш: первые запросы могут быть на 40 % медленнее при промахах I-cache после деплоя.
Держите fallback на стандартный парсер, если WASM отключают по памяти; лимиты в обоих режимах должны совпадать.
Версионные контракты с мобильными и десктопными клиентами
Публикуйте лимиты в машиночитаемом /gateway/policy, bump вместе с semver шлюза, чтобы Flutter, Electron или Swift не полагались на магические константы. Укажите max_tool_output_preview_bytes для планирования таблиц в UI.
Breaking changes анонсируйте минимум за два релиза через deprecation-заголовки и changelog с теми же именами полей, что в JSON-ошибках.
Общее состояние и счётчики Redis
При нескольких воркерах централизуйте скользящие счётчики в Redis: TTL пять секунд для burst и почасовые хэши для устойчивого злоупотребления. Lua-скрипты сохраняют атомарность инкремента и проверки — иначе всплывают «дрожащие» 429, путающие легитимные ретраи.
Политики eviction выбирайте осознанно: потерять ключи квот часто лучше, чем токены аутентификации; задокументируйте компромисс для дежурных. При failover кластера квоты могут кратко ослабнуть — заложите последующие алерты.
Когда провайдеры LLM ночью расширяют контекстные окна, не поднимайте потолки шлюза слепо — перепроверьте бюджет токенайзера и панели наблюдаемости после каждого изменения политики.
Runbook должны ссылаться на эту таблицу политики, ID досок Grafana и текущий semver, чтобы новые респондеры не искали tribal knowledge в чатах.
Аренда Mac mini на Apple Silicon через MacHTML сохраняет согласованность TLS-стеков, декодеров и семантики pipe с многими клиентскими шлюзами на macOS — вместо linux-only допущений, которые вредят размеру буферов. Тихая термика и предсказуемый прирост однопоточной производительности важны при микросекундах парсера под длительными штормами 413, при OPEX порядка 16,9 $/сутки против амортизируемого железа.
Эластичные окна аренды позволяют клонировать продакшен-профили лимитов в изолированного тенанта для red team без риска для общего staging.
Нагрузочное тестирование лимитов на macOS
Закажите облачный Mac mini, чтобы зеркалировать лимиты парсера, логирование LaunchAgent и поведение TLS перед ужесточением политики.