Content Security Policy в контексте приложений на CesiumJS становится не формальной настройкой заголовков, а архитектурным ограничением, влияющим на работу рендеринга, загрузку тайлов, шейдеров, Web Workers и динамических ресурсов.
CesiumJS активно использует:
blob: URL для worker-скриптов и ресурсовКаждый из этих механизмов пересекается с CSP-директивами, и любая ошибка конфигурации приводит к частичному или полному отказу визуализации сцены без очевидных ошибок на уровне бизнес-логики.
CesiumJS в зависимости от сборки и режима работы может использовать динамически создаваемые функции, а также загружать модули, зависящие от runtime-конфигурации.
Типовая конфигурация:
Content-Security-Policy:
script-src 'self' https://unpkg.com https://assets.ion.cesium.com;
В реальных приложениях часто требуется расширение:
'unsafe-eval' — при использовании некоторых режимов
сборки и библиотек, зависящих от динамической интерпретации кодаhttps://cdn.jsdelivr.net)Более строгая политика:
script-src 'self' https://cesium.com https://assets.cesium.com;
Проблема возникает при использовании сборок, где присутствует
динамическая генерация функций через Function() или
аналогичные механизмы. CesiumJS в production-сборке старается
минимизировать такие зависимости, однако сторонние плагины могут их
возвращать.
CesiumJS выносит значительную часть вычислений в Web Workers:
Workers часто создаются через Blob URL, что делает
директиву worker-src ключевой.
Минимально рабочая конфигурация:
worker-src 'self' blob:;
Без blob: CesiumJS теряет возможность создавать
worker-скрипты динамически, что приводит к:
В некоторых конфигурациях требуется явное разрешение CDN:
worker-src 'self' blob: https://assets.ion.cesium.com;
CesiumJS активно обращается к внешним источникам данных:
Директива connect-src должна учитывать все возможные
источники:
connect-src 'self'
https://api.cesium.com
https://assets.cesium.com
https://*.arcgisonline.com
https://tile.openstreetmap.org;
Особенность Cesium Ion:
api.cesium.comassets.cesium.comЛюбое отсутствие этих доменов приводит к частичному отображению сцены: базовый globe может появляться, но terrain и tiles будут пустыми.
CesiumJS использует изображения как текстуры для:
Минимальная конфигурация:
img-src 'self' dat a: blob: https:;
Использование https: как wildcard часто становится
компромиссом, так как провайдеров изображений может быть много.
Проблемный момент — data::
Без data: часть визуальных объектов может не
отображаться вообще.
CesiumJS включает собственные стили UI-компонентов:
Конфигурация:
style-src 'self' 'unsafe-inline';
'unsafe-inline' часто становится необходимым из-за:
Строгие CSP без 'unsafe-inline' могут привести к:
CesiumJS UI использует системные и веб-шрифты:
font-src 'self' dat a: https:;
Некоторые иконки и символы могут рендериться через font glyphs, особенно в overlay UI.
Отсутствие data: или https: может привести
к:
CesiumJS не использует <object> активно,
поэтому:
object-src 'none';
Безопасная настройка для большинства приложений.
Для защиты от embedding:
frame-ancestors 'none';
или ограничение:
frame-ancestors 'self';
Cesium Viewer часто встраивается в dashboard-системы, и именно
frame-ancestors определяет возможность интеграции.
CesiumJS активно использует WebAssembly для оптимизации:
Хотя CSP не имеет отдельной директивы WASM, он подчиняется:
script-src 'self' 'wasm-unsafe-eval';
В современных браузерах WebAssembly требует корректных заголовков безопасности, и при строгом CSP без соответствующих разрешений возможны:
Комбинированная конфигурация:
Content-Security-Policy:
default-src 'self';
script-src 'self' https://cdn.jsdelivr.net https://assets.cesium.com;
worker-src 'self' blob: https://assets.cesium.com;
connect-src 'self' https://api.cesium.com https://assets.cesium.com https://tile.openstreetmap.org;
img-src 'self' dat a: blob: https:;
style-src 'self' 'unsafe-inline';
font-src 'self' dat a: https:;
object-src 'none';
frame-ancestors 'none';
Эта конфигурация отражает баланс между:
Интеграция Cesium Ion добавляет дополнительные требования:
Ошибки CSP в этом контексте часто проявляются как:
Критическая директива:
connect-src https://api.cesium.com https://assets.cesium.com;
CesiumJS использует URL.createObjectURL для:
Это делает blob: обязательным элементом CSP.
Отсутствие поддержки blob: разрушает внутренний
pipeline:
Неправильная CSP не только блокирует функциональность, но и влияет на производительность:
CesiumJS в таких условиях может выглядеть “рабочим”, но фактически деградировать до однопоточного режима.
При добавлении пользовательских расширений к CesiumJS CSP усложняется:
Каждое новое расширение должно рассматриваться как отдельный CSP-вектор, а не как часть базовой конфигурации CesiumJS.