REST API и вебхуки — это двери, через которые в ваш магазин на 1С-Битрикс приходят заказы из мобильного приложения, платежи от банка, статусы доставки от службы логистики и данные из 1С. Пока эти двери открыты только «своим», всё хорошо. Но токен, вшитый в URL вебхука, — это по сути логин и пароль в одной строке: если он утёк в лог, в репозиторий или в скриншот, злоумышленник получает те же права, что и легитимная интеграция. А необработанный вебхук от неизвестного отправителя способен создать фальшивый оплаченный заказ или изменить остатки.
Ниже — практическое руководство по защите REST и вебхуков в 1С-Битрикс: как выдавать токены по принципу наименьших привилегий, подписывать запросы, отсекать повторы, ограничивать частоту обращений и строго валидировать входящие данные. Материал — выжимка из наших проектов по аудиту и защите сайтов на 1С-Битрикс, где чаще всего именно API и вебхуки оказываются самым слабым и при этом самым недооценённым звеном.
Коротко
- Выдавайте каждому интегратору отдельный токен с минимальным набором прав — один вебхук на одну задачу.
- Подписывайте тело запроса HMAC-SHA256 и проверяйте подпись до обработки данных.
- Добавляйте метку времени и идентификатор события — это защита от повторной отправки (replay) и основа идемпотентности.
- Ограничивайте частоту обращений (rate limiting) по токену, IP и методу; при превышении отдавайте
429. - Валидируйте всё входящее по белым спискам, храните секреты вне веб-корня и логируйте обращения для аудита.
Модель угроз: что атакуют в REST и вебхуках
Прежде чем ставить замки, полезно понять, откуда именно приходят взломщики. Безопасность API — это не один «главный» механизм, а набор мер против конкретных угроз. Если держать модель угроз в голове, становится ясно, зачем нужна каждая защита и что она закрывает.
Основные векторы атак на REST-эндпойнты и вебхуки магазина на 1С-Битрикс выглядят так:
- Кража токена. Токен вебхука попал в лог веб-сервера, в историю git, в тикет поддержки или в незашифрованный трафик. Владелец токена получает все связанные с ним права.
- Подделка отправителя. Злоумышленник узнал адрес вашего обработчика вебхуков и шлёт на него фальшивые события — «оплата прошла», «заказ подтверждён», «остаток обновлён».
- Повтор запроса (replay). Перехваченный или случайно повторённый легитимный запрос отправляется снова, создавая дубль заказа, повторное списание бонусов или двойное обновление статуса.
- Перебор и злоупотребление лимитами. Массовые обращения к API исчерпывают ресурсы: база данных, пул соединений, лимиты внешних сервисов. Частный случай — DoS через дорогой метод.
- Инъекции через входные данные. В полях вебхука приходят SQL-фрагменты, HTML/JS, путь к файлу или сериализованный объект, которые попадают в базу, в вывод или в файловую систему без проверки.
- Повышение привилегий (IDOR). Через чужой идентификатор заказа или пользователя интеграция получает или меняет данные, к которым не должна иметь доступа.
Каждой из этих угроз соответствует своя мера защиты, и дальше в статье мы пройдём по ним по порядку. Важно понимать, что меры работают в связке: подпись без метки времени не спасает от повтора, а валидация без ограничения частоты не спасает от перебора. Безопасность API — это слоёная оборона, где пробитие одного слоя не должно означать полный доступ.
scope=* или эквивалент), вшитый в клиентское приложение или в публичный фронтенд, — это утечка, ждущая своего часа. Токен, который видит браузер или мобильный клиент, считайте скомпрометированным по умолчанию.
Вебхуки в 1С-Битрикс: входящие и исходящие
Чтобы говорить о защите предметно, нужно различать два принципиально разных типа вебхуков. Они создают разные риски и требуют разных мер.
- Входящий вебхук (incoming). Это URL с токеном, который вы создаёте в Битриксе и отдаёте внешнему сервису. Сервис дёргает этот адрес, чтобы вызвать методы REST — получить заказы, обновить остаток, создать сделку. Здесь Битрикс выступает сервером, а главный риск — кража токена и вызов методов от вашего имени.
- Исходящий вебхук (outgoing). Это обработчик события: когда в Битриксе что-то происходит (создан заказ, изменён элемент), платформа сама шлёт HTTP-запрос на указанный вами внешний URL. Здесь Битрикс выступает клиентом, а риск смещается на принимающую сторону: она должна убедиться, что запрос действительно от Битрикса, а не подделан.
Разница критична. Для входящего вебхука основная защита — управление токеном и его правами на стороне Битрикса плюс ограничение источника по IP. Для исходящего вебхука защита — это подпись запроса, которую проверяет ваш внешний обработчик, потому что его адрес рано или поздно становится известен, и любой сможет прислать туда фальшивое «событие».
Отдельно стоит REST через OAuth-приложение — это уже не статический токен в URL, а полноценный протокол авторизации с областями доступа (scope), access- и refresh-токенами. Мы сравним подходы в разделе про выбор между вебхуком и приложением, а глубокое устройство самого REST разобрано в отдельном материале — REST API в 1С-Битрикс: интеграции, вебхуки и приложения.
Токены и права: принцип наименьших привилегий
Первый и самый дешёвый рубеж обороны — правильно выданные права. Большинство инцидентов с вебхуками масштабны не потому, что токен украли, а потому, что украденный токен мог слишком много. Принцип наименьших привилегий означает: каждая интеграция получает ровно те права, которые ей нужны для своей задачи, и ни одним больше.
Практические правила выдачи токенов:
- Один вебхук — одна задача. Интеграции с 1С нужен обмен каталогом и заказами, а сервису рассылок — только чтение контактов. Не создавайте один «универсальный» вебхук с полным набором прав на всех.
- Минимальный набор методов. В настройках вебхука отмечайте только те группы методов (scope), которые реально используются:
catalog,sale,crm— по отдельности, а не всё сразу. - Отдельный токен на каждого контрагента. Если с API работают несколько внешних систем, у каждой должен быть свой токен. Так при компрометации вы отзываете один ключ, не ломая остальные интеграции.
- Ограничение по IP. Там, где источник запросов известен и статичен, добавьте белый список IP-адресов на уровне веб-сервера или приложения. Токен, пришедший с чужого адреса, отклоняйте.
- Срок жизни и ротация. Заложите возможность плановой смены токена. Долгоживущий ключ, который никто ни разу не менял, — кандидат на утечку.
Отдельно про права на объекты. Даже корректно ограниченный по методам токен может стать инструментом атаки IDOR, если обработчик не проверяет, что интеграция имеет право работать именно с этим заказом или пользователем. Проверка прав на объект — это уже уровень бизнес-логики: недостаточно спросить «есть ли у токена метод sale.order.get», нужно ещё убедиться, что запрашиваемый заказ принадлежит зоне ответственности данной интеграции.
Подписи вебхуков: HMAC и целостность
Подпись отвечает на два вопроса приёмника: «запрос действительно от доверенного отправителя?» и «данные не изменились по пути?». Стандартный механизм для этого — HMAC (hash-based message authentication code): отправитель и получатель знают общий секрет, отправитель считает хеш от тела запроса с этим секретом и кладёт результат в заголовок, а получатель повторяет вычисление и сравнивает.
Ключевые свойства правильной подписи:
- Подписывается сырое тело. Хеш считается от точного байтового содержимого запроса, а не от разобранного и заново собранного объекта — иначе подпись «поплывёт» из-за форматирования.
- Стойкий алгоритм. Используйте
HMAC-SHA256и достаточно длинный секрет. Простой MD5 или самодельная «подпись через конкатенацию» не годятся. - Сравнение за постоянное время. Сравнивайте подписи функцией, устойчивой к тайминг-атакам (
hash_equalsв PHP), а не обычным==. - Секрет вне URL и тела. Общий секрет никогда не передаётся в самом запросе — он есть только у двух сторон заранее.
На стороне Битрикса, отправляющего исходящий вебхук, подпись формируется так:
<?php
// Отправитель (Битрикс): подписываем тело исходящего вебхука
$payload = json_encode($event, JSON_UNESCAPED_UNICODE);
$ts = (string) time();
$secret = getenv('WEBHOOK_SECRET'); // секрет вне кода
$signature = hash_hmac('sha256', $ts . '.' . $payload, $secret);
$headers = [
'Content-Type: application/json',
'X-Webhook-Timestamp: ' . $ts,
'X-Webhook-Signature: ' . $signature,
];
А принимающая сторона проверяет подпись до любой обработки данных:
<?php
// Приёмник: проверяем подпись прежде, чем доверять данным
$raw = file_get_contents('php://input');
$ts = $_SERVER['HTTP_X_WEBHOOK_TIMESTAMP'] ?? '';
$got = $_SERVER['HTTP_X_WEBHOOK_SIGNATURE'] ?? '';
$expected = hash_hmac('sha256', $ts . '.' . $raw, WEBHOOK_SECRET);
if (!hash_equals($expected, $got)) {
http_response_code(401);
exit('bad signature');
}
// подпись верна — теперь можно валидировать и обрабатывать
Обратите внимание: в подпись включена метка времени $ts. Это не случайно — она нужна для защиты от повторов, о которой следующий раздел. Сама по себе подпись гарантирует подлинность и целостность, но не мешает злоумышленнику переслать однажды перехваченный корректный запрос ещё раз.
Метка времени и защита от повторов
Представьте: злоумышленник перехватил (или ваш же сервис по ошибке продублировал) валидный, корректно подписанный вебхук «оплата заказа №100 прошла». Если обработчик проверяет только подпись, повторная отправка этого же запроса пройдёт проверку — подпись-то настоящая. Результатом может стать повторное подтверждение оплаты, дубль отгрузки, повторное начисление бонусов.
Защита строится на двух элементах, которые включаются в подписываемую часть запроса:
- Метка времени (timestamp). Приёмник отклоняет запросы, чья метка старше допустимого окна (например, 5 минут). Это резко сокращает окно, в котором перехваченный запрос вообще можно переиграть.
- Уникальный идентификатор события (nonce / event id). Приёмник запоминает уже обработанные идентификаторы и отклоняет повтор. Даже в пределах окна один и тот же запрос не сработает дважды.
<?php
// Приёмник: отсекаем старые и повторные запросы
$ts = (int)($_SERVER['HTTP_X_WEBHOOK_TIMESTAMP'] ?? 0);
$eventId = $_SERVER['HTTP_X_WEBHOOK_ID'] ?? '';
if (abs(time() - $ts) > 300) { // окно 5 минут
http_response_code(408);
exit('stale');
}
if (event_already_seen($eventId)) { // проверка в кэше/БД
http_response_code(200); // повтор — отвечаем ОК, но не обрабатываем
exit('duplicate');
}
event_remember($eventId, 3600); // запоминаем на час
Такой подход тесно связан с идемпотентностью, к которой мы вернёмся ниже: даже если внешний сервис из-за таймаута решит повторить доставку вебхука (а надёжные сервисы так и делают), ваш обработчик выполнит операцию только один раз. Тема надёжной доставки и повторов в интеграциях подробно разобрана в статье API, очереди и надёжность интеграций в Битрикс.
200, а не ошибкой, — осознанное решение. Если вернуть ошибку, добросовестный отправитель продолжит ретраить «неудавшийся» вебхук. Код 200 без повторной обработки говорит ему «принято» и останавливает лавину повторов.
Ограничение частоты (rate limiting)
Ограничение частоты защищает и от злонамеренного перебора, и от «дружественного» шторма запросов, когда чужая интеграция забагована и долбит ваш эндпойнт в цикле. Без лимита один клиент способен исчерпать пул соединений к базе и положить сайт для всех.
Разумная стратегия — многоуровневый лимит, где каждый уровень закрывает свой класс проблем:
| Уровень | Где применяется | Что ограничивает |
|---|---|---|
| Сеть / reverse-proxy | Nginx, Cloudflare, балансировщик | Запросы с одного IP, защита от грубого флуда |
| Токен / интеграция | Обработчик REST | Обращения на один токен в скользящем окне |
| Метод / эндпойнт | Обработчик метода | Дорогие операции (импорт, отчёты) отдельно и строже |
| Штатные лимиты REST Битрикса | Ядро платформы | Число запросов и «стоимость» операций к облаку/self-hosted |
Реализовать счётчик в скользящем окне удобно поверх кэша Битрикса или Redis — по ключу «токен + минута». При превышении лимита возвращайте корректный ответ, а не просто рвите соединение:
<?php
// Простой лимит по токену в скользящем окне (псевдо-хранилище $cache)
$key = 'rl:' . $tokenId . ':' . floor(time() / 60); // окно 1 минута
$count = (int)$cache->get($key);
if ($count >= 120) { // не более 120 запросов в минуту
header('Retry-After: 60');
http_response_code(429); // Too Many Requests
exit('rate limit');
}
$cache->set($key, $count + 1, 120);
Код 429 Too Many Requests с заголовком Retry-After — это правильный, «вежливый» способ сказать клиенту, когда можно вернуться. Добросовестные интеграции его понимают и снижают темп. Для дорогих операций (массовый импорт каталога, генерация отчёта) задавайте отдельный, более строгий лимит, потому что одна такая операция стоит как сотни обычных чтений.
Валидация входящих данных
Золотое правило: любые данные, пришедшие снаружи, враждебны, пока не доказано обратное. Подпись подтверждает, что запрос от доверенного отправителя, но не гарантирует, что содержимое корректно, — отправитель мог сам получить мусор или быть скомпрометирован. Поэтому валидация нужна всегда, даже для подписанных вебхуков.
Что и как проверять:
- Тип и формат. Число — это число, а не строка «12abc»; дата в ожидаемом формате; email проходит проверку. Приводите к строгим типам до использования.
- Диапазоны и длины. Количество товара не отрицательное и не миллион; строка комментария не длиннее разумного предела; идентификатор — положительное целое.
- Белые списки. Статус заказа принадлежит известному набору; валюта — из списка поддерживаемых. Разрешайте известное, а не запрещайте плохое.
- Белый список полей. Берите из запроса только ожидаемые поля, а лишние игнорируйте. Это защищает от mass assignment, когда клиент «дописывает» служебные поля.
- Права на объект. Проверяйте, что интеграция вправе трогать именно этот заказ/пользователя — защита от IDOR.
- Кодировка и спецсимволы. Экранируйте данные при выводе и используйте параметризованные запросы к базе, чтобы не открыть XSS и SQL-инъекции.
<?php
// Валидация тела вебхука по белому списку полей и типов
$data = json_decode($raw, true);
if (!is_array($data)) { http_response_code(400); exit('bad json'); }
$orderId = filter_var($data['order_id'] ?? null, FILTER_VALIDATE_INT);
$status = $data['status'] ?? '';
$amount = filter_var($data['amount'] ?? null, FILTER_VALIDATE_FLOAT);
$allowedStatus = ['paid', 'shipped', 'canceled'];
if ($orderId === false || $orderId <= 0
|| !in_array($status, $allowedStatus, true)
|| $amount === false || $amount < 0) {
http_response_code(422); // Unprocessable Entity
exit('validation failed');
}
// дальше — только чистые, типизированные значения
Обратите внимание на код 422 Unprocessable Entity для семантически неверных данных и 400 Bad Request для битого формата — разные коды помогают отправителю понять, что именно не так. Тема защиты кастомного кода от инъекций и IDOR подробно разобрана в материале Безопасность магазина на Битрикс: OWASP на практике — валидация вебхуков подчиняется тем же принципам.
Транспорт: HTTPS, TLS и заголовки
Самая изящная подпись бессмысленна, если запрос идёт по открытому HTTP: секрет в заголовке или токен в URL можно перехватить прямо в сети. Транспортная безопасность — это фундамент, без которого остальные меры держатся на честном слове.
- Только HTTPS. Все вебхуки — входящие и исходящие — работают исключительно по HTTPS. HTTP-эндпойнт для приёма вебхуков закройте совсем или редиректьте с обрывом обработки.
- Актуальный TLS. Отключите устаревшие протоколы (TLS 1.0/1.1) и слабые шифры. При отправке исходящих вебхуков не отключайте проверку сертификата принимающей стороны «чтобы работало».
- Строгие заголовки. Включите HSTS, задайте разумные значения таймаутов и максимального размера тела на веб-сервере, чтобы огромный запрос не исчерпал память.
- Токен не в URL, где можно. URL целиком попадает в логи веб-сервера и прокси. Формат входящих вебхуков Битрикса кладёт токен в путь — компенсируйте это тем, что логи с полными URL защищены и ротуются, а токен считается секретом.
Отдельно про исходящую сторону: когда Битрикс сам ходит к внешним адресам, он становится потенциальным инструментом SSRF-атаки, если URL обработчика можно подменить через настройки без контроля. Ограничивайте, куда платформа вправе слать исходящие запросы, и не позволяйте задавать произвольные внутренние адреса (localhost, метаданные облака) в качестве приёмника вебхука.
Идемпотентность обработчиков
Идемпотентность — свойство операции давать один и тот же результат при повторном выполнении. Для вебхуков это не абстракция, а прямая необходимость: сети ненадёжны, таймауты случаются, и любой серьёзный отправитель повторяет доставку, если не получил быстрый 200. Если ваш обработчик не идемпотентен, каждый ретрай создаёт дубль.
Как делать операции идемпотентными:
- Ключ идемпотентности. Внешний идентификатор события или заказа используйте как естественный ключ: перед созданием проверьте, нет ли уже объекта с таким ключом.
- Upsert вместо insert. Там, где уместно, «создать или обновить» безопаснее слепого «создать»: повтор просто обновит существующую запись теми же данными.
- Быстрый ответ, отложенная работа. Приняли вебхук, проверили, положили в очередь, вернули
200. Тяжёлую обработку выполняйте асинхронно — это и ускоряет ответ, и уменьшает число ретраев. - Журнал обработанных событий. Тот же реестр идентификаторов, что защищает от replay, обеспечивает и идемпотентность — это две стороны одной медали.
Связка «быстрый приём + очередь + идемпотентная обработка» — это архитектурный паттерн надёжных интеграций. Он одновременно повышает и безопасность (меньше окна для гонок и повторов), и устойчивость к пиковым нагрузкам. Детальный разбор очередей и гарантий доставки — в статье про надёжность интеграций.
Реализация в 1С-Битрикс
Теперь соберём всё вместе применительно к платформе. Вот как перечисленные меры ложатся на конкретные инструменты 1С-Битрикс.
- Создание вебхука. Входящий вебхук создаётся в разделе «Разработчикам → Другое → Вебхук» (или через модуль REST на самохостинге). При создании отмечайте только нужные права доступа — это и есть настройка scope по принципу наименьших привилегий.
- Обработчик исходящих событий. Для исходящих уведомлений вешайте обработчик на события ядра (например,
OnSaleOrderSaved, события каталога) и внутри него формируйте подписанный HTTP-запрос черезBitrix\Main\Web\HttpClient. Подпись HMAC добавляйте в заголовки, как в примерах выше. - Свой REST-эндпойнт. Кастомный приёмник вебхуков удобно оформить как отдельный маршрут через
Bitrix\Main\Routingили отдельный публичный файл с ранней проверкой подписи, метки времени и лимита — до подключения тяжёлого ядра. - Хранение секретов. Секреты и токены выносите в
.settings.phpвне репозитория или в переменные окружения, а не в код компонента. Файл конфигурации закройте от веб-доступа. - Кэш для лимитов и nonce. Для счётчиков rate limit и реестра обработанных событий используйте
Bitrix\Main\Data\Cacheили подключённый Redis/Memcached — быстро и без нагрузки на основную базу. - Логирование. Пишите факт обращения, токен (маскированный), результат проверки подписи и код ответа в отдельный журнал — через
Bitrix\Main\Diagили свою таблицу аудита. - Отзыв и ротация. Отзыв скомпрометированного вебхука — удаление или пересоздание в том же интерфейсе; заложите процедуру смены секрета исходящих вебхуков без простоя (поддержка двух активных секретов на время переключения).
Секреты: хранение и ротация
Токены и HMAC-секреты — это и есть та ценность, ради которой затевается защита. Все остальные меры рушатся, если секрет лежит в открытом доступе. Дисциплина хранения секретов часто важнее, чем выбор алгоритма подписи.
- Не в репозитории. Секреты никогда не коммитятся в git. Даже приватный репозиторий — это копии на ноутбуках, в CI и в бэкапах. Используйте переменные окружения или защищённое хранилище.
- Не в веб-корне. Конфиг с секретами держите вне
DOCUMENT_ROOTили закрывайте от прямого HTTP-доступа правилами веб-сервера. Файл.env, отдаваемый по прямой ссылке, — классическая утечка. - Маскирование в логах. В журналах, сообщениях об ошибках и трейсах значения токенов заменяйте на маску вида
tok_****3f. Логи имеют свойство утекать вместе с бэкапами и попадать в системы мониторинга. - Ротация без простоя. Заложите механизм, позволяющий держать одновременно старый и новый секрет короткое время — тогда смена ключа не рвёт работающую интеграцию.
- Немедленный отзыв. Должна быть кнопка «отозвать этот токен прямо сейчас». Скорость реакции на компрометацию критична: чем дольше живёт утёкший ключ, тем больше ущерб.
Полезно вести реестр всех выданных токенов: кому выдан, какие права, когда создан, когда последний раз использовался. Токен, который не обращался к API месяцами, — кандидат на отзыв: либо интеграция мертва, либо ключ забыт и представляет только риск.
Логирование, аудит и мониторинг
Защита, о которой вы не знаете, сработала она или нет, — это защита наполовину. Логирование и мониторинг превращают набор мер в управляемую систему: вы видите попытки атак, замечаете аномалии и можете расследовать инциденты постфактум.
Что стоит фиксировать по каждому обращению к API и вебхукам:
| Поле | Зачем |
|---|---|
| Время, IP, токен (маскированный) | Кто и откуда обращался — база для расследования |
| Метод / эндпойнт | Понять, что именно пытались вызвать |
| Результат проверки подписи | Всплеск неверных подписей — признак атаки подделкой |
| Код ответа (2xx / 4xx / 429) | Рост 401/429 — перебор токенов или флуд |
| Идентификатор события | Связать повторы и восстановить цепочку |
Поверх логов настройте простые сигналы тревоги: резкий рост числа ответов 401 (кто-то подбирает токен или шлёт неподписанные запросы), всплеск 429 (флуд или забагованная интеграция), обращения с новых, ранее не встречавшихся IP к чувствительным методам. Даже базовый мониторинг этих метрик позволяет заметить инцидент за минуты, а не за недели, когда о нём сообщат клиенты.
Вебхук или OAuth-приложение — сравнение
Частый вопрос при проектировании интеграции: делать вебхук или полноценное OAuth-приложение. С точки зрения безопасности разница существенная, и выбор зависит от того, кто и как будет пользоваться доступом.
| Критерий | Входящий вебхук | OAuth-приложение |
|---|---|---|
| Тип секрета | Статический токен в URL | Короткоживущий access + refresh-токен |
| Управление правами | Фиксированный scope при создании | Запрос областей доступа, гибко |
| Отзыв доступа | Удалить/пересоздать вебхук | Отозвать токены приложения централизованно |
| Риск при утечке | Высокий: ключ действует, пока не отозван | Ниже: access-токен быстро истекает |
| Сложность подключения | Минимальная | Выше: нужен OAuth-флоу |
| Когда уместно | Внутренние задачи, узкий доверенный сервис | Внешние партнёры, публичные и тиражные интеграции |
Практический вывод: вебхук хорош там, где вы полностью контролируете обе стороны и права узкие — обмен с вашей же 1С, внутренний сервис. Как только доступ выдаётся внешнему партнёру, которого вы не контролируете, или интеграция тиражируется на многих клиентов, надёжнее OAuth-приложение с ограниченными областями и коротким сроком жизни токенов. Универсальный принцип один и тот же: минимум прав, короткий срок жизни секрета, возможность быстро отозвать доступ.
Частые ошибки
- Создали один вебхук с полными правами и раздали его нескольким подрядчикам — при утечке отзывать нечего, ломается всё сразу.
- Принимают исходящие вебхуки без проверки подписи — любой, кто узнал адрес обработчика, шлёт фальшивые «оплаты» и «статусы».
- Проверяют подпись, но без метки времени — перехваченный или продублированный запрос успешно проходит повторно.
- Сравнивают подписи через
==вместоhash_equals— открывают тайминг-атаку на подбор подписи. - Нет ограничения частоты на кастомных эндпойнтах — одна забагованная интеграция в цикле кладёт базу.
- Доверяют данным после проверки подписи и пишут их в базу без валидации типов и диапазонов — открывают инъекции и порчу данных.
- Обработчик не идемпотентен — ретраи отправителя создают дубли заказов и повторные списания.
- Секреты лежат в коде репозитория или в
.envвнутри веб-корня, а токены светятся в логах без маскирования.
Чек-лист внедрения
Сведём меры в практический список, по которому удобно принимать готовность защиты API и вебхуков перед выходом в продакшн.
- Токены по задачам. Каждой интеграции — свой токен с минимальным scope; универсальных ключей с полными правами нет.
- Только HTTPS. Все вебхуки работают по TLS; устаревшие протоколы и слабые шифры отключены; проверка сертификатов включена.
- Подпись включена. Исходящие вебхуки подписаны HMAC-SHA256, приёмник сверяет подпись через
hash_equalsдо обработки. - Защита от повторов. В подпись входит метка времени, старые запросы отклоняются, идентификаторы событий запоминаются.
- Ограничение частоты. Настроены лимиты по IP, токену и дорогим методам; при превышении —
429сRetry-After. - Валидация данных. Все входящие поля проверяются по типам, диапазонам и белым спискам; проверяются права на объект (анти-IDOR).
- Идемпотентность. Повторная доставка одного события не создаёт дублей; тяжёлая обработка вынесена в очередь.
- Секреты защищены. Токены вне репозитория и веб-корня, маскированы в логах, есть процедура ротации и мгновенного отзыва.
- Аудит и мониторинг. Обращения логируются, настроены сигналы на всплеск 401/429 и обращения с новых IP.
Вывод
Безопасность REST и вебхуков в 1С-Битрикс — это не один замок, а слоёная оборона: транспорт по HTTPS, узкие токены по принципу наименьших привилегий, подпись HMAC с меткой времени против подделки и повторов, ограничение частоты против перебора и строгая валидация всего входящего. Ни один слой не заменяет другой — они работают вместе, и пробитие одного не должно открывать доступ ко всему. Пройдите чек-лист, наведите порядок в токенах и подписях — и самое недооценённое звено вашего магазина перестанет быть самым слабым.