Content Security Policy

Базовая модель ограничений CSP для WebGL-приложений

Content Security Policy в контексте приложений на CesiumJS становится не формальной настройкой заголовков, а архитектурным ограничением, влияющим на работу рендеринга, загрузку тайлов, шейдеров, Web Workers и динамических ресурсов.

CesiumJS активно использует:

  • WebGL контекст для рендеринга сцены
  • Web Workers для параллельной обработки тайлов и геометрии
  • динамическую загрузку скриптов и шейдеров
  • blob: URL для worker-скриптов и ресурсов
  • внешние источники данных (Cesium Ion, imagery providers, terrain servers)

Каждый из этих механизмов пересекается с CSP-директивами, и любая ошибка конфигурации приводит к частичному или полному отказу визуализации сцены без очевидных ошибок на уровне бизнес-логики.


script-src и ограничения выполнения кода CesiumJS

CesiumJS в зависимости от сборки и режима работы может использовать динамически создаваемые функции, а также загружать модули, зависящие от runtime-конфигурации.

Типовая конфигурация:

Content-Security-Policy:
  script-src 'self' https://unpkg.com https://assets.ion.cesium.com;

В реальных приложениях часто требуется расширение:

  • 'unsafe-eval' — при использовании некоторых режимов сборки и библиотек, зависящих от динамической интерпретации кода
  • CDN CesiumJS (например, https://cdn.jsdelivr.net)
  • домены Cesium Ion

Более строгая политика:

script-src 'self' https://cesium.com https://assets.cesium.com;

Проблема возникает при использовании сборок, где присутствует динамическая генерация функций через Function() или аналогичные механизмы. CesiumJS в production-сборке старается минимизировать такие зависимости, однако сторонние плагины могут их возвращать.


worker-src и критическая роль Web Workers

CesiumJS выносит значительную часть вычислений в Web Workers:

  • декодирование и загрузка тайлов
  • обработка геометрии
  • подготовка terrain данных
  • оптимизация батчинга объектов

Workers часто создаются через Blob URL, что делает директиву worker-src ключевой.

Минимально рабочая конфигурация:

worker-src 'self' blob:;

Без blob: CesiumJS теряет возможность создавать worker-скрипты динамически, что приводит к:

  • отсутствию рендеринга terrain
  • зависанию загрузки tiles
  • резкому падению FPS до состояния “пустого экрана”

В некоторых конфигурациях требуется явное разрешение CDN:

worker-src 'self' blob: https://assets.ion.cesium.com;

connect-src и сетевые зависимости CesiumJS

CesiumJS активно обращается к внешним источникам данных:

  • Cesium Ion API
  • imagery providers (Bing Maps, OpenStreetMap, Mapbox)
  • terrain servers
  • кастомные WMS/WMTS endpoints
  • 3D Tiles сервера

Директива connect-src должна учитывать все возможные источники:

connect-src 'self'
  https://api.cesium.com
  https://assets.cesium.com
  https://*.arcgisonline.com
  https://tile.openstreetmap.org;

Особенность Cesium Ion:

  • авторизация через токены
  • запросы к api.cesium.com
  • загрузка ассетов с assets.cesium.com

Любое отсутствие этих доменов приводит к частичному отображению сцены: базовый globe может появляться, но terrain и tiles будут пустыми.


img-src и визуальные провайдеры

CesiumJS использует изображения как текстуры для:

  • спутниковых подложек
  • тайловых сеток
  • декалей и billboard-объектов
  • иконок сущностей (Entities)

Минимальная конфигурация:

img-src 'self' dat a: blob: https:;

Использование https: как wildcard часто становится компромиссом, так как провайдеров изображений может быть много.

Проблемный момент — data::

  • используется для inline-генерации изображений
  • может применяться для иконок и canvas-export текстур

Без data: часть визуальных объектов может не отображаться вообще.


style-src и CSS зависимости CesiumJS

CesiumJS включает собственные стили UI-компонентов:

  • панель управления сценой
  • timeline widget
  • credit container
  • navigation help overlay

Конфигурация:

style-src 'self' 'unsafe-inline';

'unsafe-inline' часто становится необходимым из-за:

  • динамической генерации CSS классов
  • вставки стилей для UI-компонентов через JavaScript
  • legacy компонентов Cesium Widgets

Строгие CSP без 'unsafe-inline' могут привести к:

  • отсутствию панели управления сценой
  • некорректному позиционированию UI элементов
  • исчезновению attribution блоков

font-src и отображение интерфейса

CesiumJS UI использует системные и веб-шрифты:

font-src 'self' dat a: https:;

Некоторые иконки и символы могут рендериться через font glyphs, особенно в overlay UI.

Отсутствие data: или https: может привести к:

  • пустым иконкам
  • некорректной отрисовке кнопок навигации
  • замене символов на квадраты

object-src и frame-ancestors

CesiumJS не использует <object> активно, поэтому:

object-src 'none';

Безопасная настройка для большинства приложений.

Для защиты от embedding:

frame-ancestors 'none';

или ограничение:

frame-ancestors 'self';

Cesium Viewer часто встраивается в dashboard-системы, и именно frame-ancestors определяет возможность интеграции.


WASM и требования к современным сборкам CesiumJS

CesiumJS активно использует WebAssembly для оптимизации:

  • геометрических вычислений
  • декодирования форматов
  • ускоренной обработки tiles

Хотя CSP не имеет отдельной директивы WASM, он подчиняется:

script-src 'self' 'wasm-unsafe-eval';

В современных браузерах WebAssembly требует корректных заголовков безопасности, и при строгом CSP без соответствующих разрешений возможны:

  • сбои в загрузке terrain
  • падение производительности
  • отключение оптимизированных путей рендеринга

Распространённый production CSP для CesiumJS

Комбинированная конфигурация:

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';

Эта конфигурация отражает баланс между:

  • безопасностью выполнения кода
  • необходимостью динамических worker’ов
  • доступом к внешним геоданным
  • корректной работой UI Cesium Widgets

CSP и Cesium Ion токены

Интеграция Cesium Ion добавляет дополнительные требования:

  • запросы авторизации через HTTPS API
  • загрузка приватных assets
  • доступ к защищённым 3D Tiles

Ошибки CSP в этом контексте часто проявляются как:

  • бесконечная загрузка terrain
  • отсутствие глобуса при наличии UI
  • ошибки в Network без явного JavaScript stack trace

Критическая директива:

connect-src https://api.cesium.com https://assets.cesium.com;

Blob URL и внутренняя архитектура CesiumJS

CesiumJS использует URL.createObjectURL для:

  • worker scripts
  • временных текстур
  • промежуточных данных загрузки tiles

Это делает blob: обязательным элементом CSP.

Отсутствие поддержки blob: разрушает внутренний pipeline:

  • workers не стартуют
  • очередь загрузки зависает
  • scene остаётся пустой при отсутствии ошибок уровня приложения

CSP и производительность рендеринга

Неправильная CSP не только блокирует функциональность, но и влияет на производительность:

  • fallback на main thread при отсутствии workers
  • отсутствие параллельной декодировки tiles
  • увеличение GC нагрузки из-за неэффективных обходных путей

CesiumJS в таких условиях может выглядеть “рабочим”, но фактически деградировать до однопоточного режима.


Политика безопасности и расширения CesiumJS

При добавлении пользовательских расширений к CesiumJS CSP усложняется:

  • кастомные shader pipelines требуют дополнительных script-src источников
  • внешние analytics библиотеки добавляют connect-src домены
  • кастомные tile providers требуют расширения img-src и connect-src

Каждое новое расширение должно рассматриваться как отдельный CSP-вектор, а не как часть базовой конфигурации CesiumJS.