Современные браузерные карты, построенные на Mapbox GL JS, активно используют динамическую загрузку ресурсов: тайлы, шрифты, спрайты, стили, Web Workers и WebGL-шейдеры. Эти механизмы вступают в прямое взаимодействие с политиками безопасности браузера, прежде всего с Content Security Policy (CSP). При строгой конфигурации CSP большинство стандартных настроек Mapbox GL JS перестают работать без явной адаптации.
Mapbox GL JS опирается на несколько типов ресурсов, каждый из которых должен быть разрешён отдельными директивами CSP:
Без точной настройки CSP карта либо не отображается, либо частично ломается (пустой canvas, отсутствие подписей, невозможность загрузки тайлов).
Mapbox GL JS создаёт Web Workers и может использовать blob URL:
script-src должен разрешать:
'self'blob:Особое значение имеет blob: — без него Web Workers не
запускаются.
Mapbox GL JS активно использует Web Workers для рендеринга векторных тайлов:
worker-src 'self' blob:В строгих CSP конфигурациях отсутствие worker-src
полностью блокирует инициализацию карты.
Mapbox динамически добавляет стили (например, для контрольных элементов и canvas overlay):
style-src 'self' 'unsafe-inline'Хотя использование 'unsafe-inline' нежелательно, в
Mapbox GL JS оно часто необходимо, если не используется
nonce-модель.
Тайлы, спрайты и иконки загружаются как изображения:
img-src 'self' dat a: https:Особенно важно разрешить https: при использовании
сервисов Mapbox или собственных tile-серверов.
Все сетевые запросы к API, стилям и тайлам проходят через fetch/XHR:
connect-src 'self' https://api.mapbox.com https://events.mapbox.comПри кастомных источниках добавляются собственные домены tile server’ов.
Шрифты (glyphs) загружаются отдельно:
font-src 'self' https://api.mapbox.comБез этого метки и подписи не отображаются.
Пример базовой рабочей политики:
Content-Security-Policy:
default-src 'self';
script-src 'self' blob: https://api.mapbox.com;
worker-src 'self' blob:;
connect-src 'self' https://api.mapbox.com https://events.mapbox.com;
img-src 'self' dat a: https:;
style-src 'self' 'unsafe-inline';
font-src 'self' https://api.mapbox.com;
Внутренний рендеринг Mapbox GL JS вынесен в отдельные потоки через:
new Worker(blobURL)Это приводит к обязательному требованию:
worker-src blob:script-src blob:Без этих разрешений карта часто остаётся в состоянии
Initializing или показывает пустой canvas.
Mapbox GL JS добавляет DOM-элементы управления (zoom, attribution, compass). Эти элементы часто создаются с inline-стилями.
При строгом CSP:
'unsafe-inline' элементы управления могут не
отображатьсяstyle-src 'self' 'nonce-abc123';
И соответствующая разметка:
<style nonce="abc123">
Более безопасная модель CSP:
style-src 'self' 'nonce-XYZ'script-src 'self' 'nonce-XYZ'Проблема: Mapbox GL JS не полностью совместим с nonce-моделью для всех внутренних стилей, поэтому требуется тестирование.
Mapbox GL JS загружает векторные тайлы по схеме:
https://api.mapbox.com/v4/...Для корректной работы необходимо:
connect-src для APIimg-src для растровых тайловhttps: для CDNMapbox GL JS предоставляет механизм перехвата запросов:
const map = new mapboxgl.Map({
container: 'map',
style: 'mapbox://styles/mapbox/streets-v12',
transformRequest: (url, resourceType) => {
return {
url,
headers: {
'X-Custom-Header': 'value'
}
};
}
});
Используется для:
При жёстких корпоративных политиках доступ к доменам Mapbox блокируется. Тогда применяется проксирование:
/mapbox/*CSP упрощается до:
connect-src 'self';
img-src 'self' dat a:;
Причины:
worker-src blob:Причины:
connect-src api.mapbox.comПричины:
font-srcПричины:
style-src 'unsafe-inline'В dev-режиме часто появляются дополнительные источники:
localhost:*ws://localhost:* (HMR)Пример расширенной политики:
connect-src 'self' https://api.mapbox.com ws://localhost:3000;
script-src 'self' blob: http://localhost:3000;
Хотя WebGL напрямую не контролируется CSP, он зависит от:
Поэтому строгий CSP без script-src 'unsafe-eval' может
ломать рендеринг в редких конфигурациях сборки.
Для продакшн-сценариев с Mapbox GL JS обычно требуется баланс между безопасностью и функциональностью:
blob: для workersconnect-src к API и CDNimg-src с HTTPSstyle-srcunsafe-inline через nonce (по
возможности)Жёсткие политики CSP фактически влияют на архитектуру приложения:
Такая конфигурация требует точного понимания потоков данных внутри Mapbox GL JS и всех типов ресурсов, которые браузер блокирует на уровне политики безопасности.