Визуализация карт в браузере объединяет несколько источников данных: пользовательский ввод, удалённые тайловые серверы, стили, GeoJSON, изображения и HTML-подобные всплывающие окна. Каждый из этих слоёв способен стать точкой внедрения вредоносного контента, если отсутствует строгая модель доверия и фильтрации данных.
Основной принцип безопасной архитектуры в картографических веб-приложениях заключается в том, что MapLibre GL JS выполняет только рендеринг, но не является источником доверия к данным. Любой входной объект — геоданные, стиль, подписи, свойства объектов — должен рассматриваться как потенциально недоверенный.
При работе с картографическими данными важно разделять систему на три независимых слоя:
Критическая ошибка проектирования — перенос доверия между слоями без проверки.
Например:
GeoJSON часто используется как основной механизм передачи
пользовательских объектов. Однако его свойства (properties)
нередко становятся источником XSS-уязвимостей.
Типичные риски:
properties.descriptionpopup.setHTMLПример опасного паттерна:
feature.properties.name внутри
innerHTMLБезопасный подход заключается в том, что GeoJSON всегда считается недоверенным источником данных.
Рекомендуемые практики:
textContent вместо
innerHTMLPopup-компоненты в MapLibre GL JS часто становятся основным вектором XSS.
Наиболее опасные сценарии:
setHTML() с пользовательскими
строкамиДаже при отсутствии явного <script> возможно
выполнение вредоносного кода через:
onerror в изображенияхonload в iframeonclick,
onmouseover)Безопасная модель:
setText()Маркеры в MapLibre GL JS создаются через обычные DOM-элементы, что делает их уязвимыми при неправильной обработке данных.
Риски:
innerHTML для генерации иконокОсобенно опасно:
Рекомендуемая модель:
document.createElementtextContentStyle JSON в MapLibre GL JS описывает всё поведение карты: источники данных, слои, фильтры, выражения.
Риски при работе с динамическими стилями:
Особое внимание требуется к:
sources → любые URL должны проходить whitelistglyphs → подмена шрифтовых серверовsprite → загрузка внешних изображенийtiles → потенциальные SSRF-подобные сценарииКлючевой принцип: style JSON должен считаться исполняемой конфигурацией, а не просто данными.
MapLibre GL JS поддерживает выражения (expressions), которые позволяют вычислять визуальные параметры слоёв.
Хотя выражения безопаснее, чем произвольный JS, они всё равно могут использоваться для:
Опасны:
case и match без
ограниченийРекомендация:
Векторные и растровые тайлы загружаются из внешних источников, что создаёт сетевую поверхность атаки.
Основные угрозы:
Практики защиты:
MapLibre GL JS загружает дополнительные ресурсы:
Каждый из этих ресурсов может быть заменён злоумышленником при отсутствии контроля домена.
Риски:
Защита:
При возможности загрузки пользовательских стилей необходимо рассматривать их как исполняемый код конфигурации.
Основные меры:
Дополнительно:
При необходимости отображения HTML-контента в popup или sidebar применяется стратегия очистки:
<script>, <iframe>,
<object>Важно учитывать, что даже очищенный HTML остаётся потенциальным источником уязвимостей при неправильной конфигурации политик CSP.
CSP выступает последней линией обороны против XSS в картографических приложениях.
Рекомендуемые директивы:
unsafe-inlineimg-src и media-srcconnect-src для тайловых
серверовscript-src для сторонних доменовОсобенно важно:
Помимо классических XSS-рисков, картографические приложения подвержены логическим атакам:
Защита строится на серверной валидации геоданных до их передачи в клиент.
Наиболее устойчивые архитектуры используют следующие принципы:
MapLibre GL JS в таком подходе выступает исключительно как слой визуализации без принятия решений о доверии к данным.