Безопасность интеграции
ShopStory предоставляет публичный каталог, runtime плеера и события взаимодействия с товаром. Ритейлер отвечает за пользовательскую сессию, актуальный остаток, корзину, checkout и персональные данные.
Модель ответственности
| Область | ShopStory | Ритейлер |
|---|---|---|
| Каталог эфиров и runtime плеера | Публичный контракт и работа сервиса | Размещение SDK и работа интерфейса |
applicationId | Выдача и привязка окружения | Раздельная конфигурация тестовой и production-среды |
| Товарный фид | Импорт согласованных полей | Качество, права на данные и стабильные идентификаторы |
| Остаток | Показ полученного снимка или согласованный custom flow | Источник актуальных данных, выбор магазина или региона и финальная проверка |
| Корзина | Вызов Web callback или передача типизированного mobile action | Сессия, CSRF, авторизация и подтверждение изменения |
| Mobile SDK | Встроенный плеер и проверка данных на границе SDK | Нативные routes, commerce actions и состояние lifecycle |
| Персональные данные | Обрабатывает только данные, предусмотренные согласованной интеграцией | Не передаёт в ShopStory лишние пользовательские данные |
applicationId и учётные данные
applicationId — публичный идентификатор маршрутизации. Он виден в браузере и не предоставляет авторизацию.
- Не используйте его как доказательство личности пользователя или сервера.
- Не передавайте через Public API секреты, персональные данные и административные команды.
- Учётные данные merchant-системы хранятся и используются только на доверенной серверной стороне.
- Не добавляйте токены в параметры URL.
- Очищайте URL и headers перед записью в логи, аналитику и crash reports.
Публичный контракт API не задаёт Bearer-схему. Подробнее: Идентификация приложения.
Входные и выходные данные
Валидируйте названия товаров, URL, параметры API и payload мобильного действия перед использованием.
- Для каждого поля проверяйте тип, допустимые значения и максимальную длину.
- Оставляйте product IDs строками; не теряйте ведущие нули и точность.
- Кодируйте пользовательский ввод через
URLSearchParams. - Выводите текст через безопасные DOM API или escaping шаблонизатора.
- Не вставляйте данные API через
innerHTML. - Для внешнего URL разрешайте только схему
httpsи хосты из exact allowlist. - Сначала проверяйте HTTP status, затем
statusJSON-конверта. Только после этого используйтеbody.
Не показывайте пользователю stack trace, детали SQL/HTTP upstream-системы и внутренние идентификаторы инфраструктуры.
Корзина и актуальный остаток
Перед изменением корзины endpoint ритейлера проверяет:
- HTTP-метод и content type.
- Действующую пользовательскую сессию.
- Штатную CSRF-защиту платформы и допустимый origin.
- Product key, quantity и вариант товара.
- Текущий остаток для выбранного магазина, региона или способа получения.
- Фактическое изменение корзины до ответа об успехе.
CORS не заменяет CSRF-защиту. Наличие session cookie само по себе не разрешает изменение данных.
Не повторяйте запрос на изменение корзины автоматически без idempotency-защиты. Web callback получает true только после подтверждённого изменения в merchant-системе.
Mobile SDK передаёт приложению типизированное действие. Способ обработки результата указан в handoff поставленного пакета. Состояние плеера и событие аналитики не подтверждают изменение корзины: Добавление товара в корзину.
Интеграция в браузере
ShopStory заранее регистрирует production origins клиента. CORS ограничивает вызовы из браузера. Запрос вне браузера по-прежнему возможен.
На сайте ритейлера:
- загрузите SDK только по
httpsс согласованного URL; - добавьте необходимые origins в действующую CSP;
- не отключайте CSP целиком ради виджета;
- не добавляйте
unsafe-evalили wildcard без подтверждённой необходимости; - задайте
X-Content-Type-Options: nosniffи актуальнуюReferrer-Policy; - для устаревшего
X-XSS-Protectionиспользуйте0, чтобы не включать legacy-фильтр браузера.
Точный порядок настройки: Content Security Policy.
Mobile SDK
Mobile SDK управляет встроенным плеером и проверяет данные на границе web/native. Приложение принимает типизированные действия поставленного пакета и не создаёт отдельный message transport поверх SDK.
- SDK принимает контент плеера только с согласованных
httpsorigins и проверяет navigation и сообщения до передачи действия приложению. - Приложение сопоставляет
feedProductIdсо своим каталогом и не строит native route из URL или произвольного payload плеера. - SDK-owned player удаляется вместе с handlers и delegates при teardown.
- Ошибка или отключение SDK не должны блокировать PDP, navigation, корзину и checkout приложения.
В integration handoff ShopStory передаёт назначенной команде координаты пакета, его точную версию и клиентские routes. Разрешённый player origin задаётся конфигурацией ShopStory: SDK получает непрозрачный HTTPS player URL и проверяет его exact origin. Host app не настраивает отдельный WebView allowlist. Публичный контракт и правила приёмки описаны в разделе Mobile SDK.
Кэш и повторы
- Разделяйте записи кэша по приложению и всем параметрам ответа.
- Не помещайте ответы с авторизацией, персонализацией или изменением корзины в общий кэш.
- Не считайте stale каталог подтверждением текущего остатка.
- Повторяйте автоматически только безопасные read-only запросы.
- Соблюдайте
Retry-After, ограничивайте общую продолжительность запросов и добавляйте jitter.
Подробнее: Кэширование и Rate limiting.
Логи и диагностика
Для диагностики записывайте endpoint без полного query string, HTTP status, business status, duration и собственный correlation ID.
Не записывайте:
- cookies и CSRF-токены;
Authorization;- тело запроса на изменение корзины;
- персональные данные покупателя;
- полный payload мобильного действия без удаления чувствительных полей;
- внутренний ответ merchant API.
Задайте срок хранения диагностических данных и ограничьте доступ к ним.
Проверка перед запуском в production
- Тестовая и production-среда используют разные назначенные конфигурации.
- В URL и frontend bundle нет учётных данных.
- Product IDs обрабатываются как строки.
- Клиент проверяет HTTP status и JSON-конверт ответа API.
- CSP проверена сначала в Report-Only.
- Endpoint корзины защищён сессией, CSRF и server-side validation.
- Интерфейс корзины сообщает об успехе только после подтверждения merchant API.
- Для mobile action состояние плеера и аналитическое событие не подтверждают изменение корзины.
- WebView ограничен trusted origin и main frame.
- Логи не содержат учётных данных и персональных данных.
- Интеграция корректно обрабатывает timeout,
429,5xxи деградированный режим.
Сообщить об уязвимости
Не публикуйте детали в открытом issue. Отправьте описание, влияние, безопасные шаги воспроизведения и контакт для ответа на security@shopstory.live. Не прикладывайте реальные учётные данные и персональные данные. Передавать чувствительные данные можно только по заранее согласованному безопасному каналу.
Публичного SLA по сроку ответа нет.
Справочные материалы: OWASP API Security Top 10 и OWASP Mobile Application Security.