SVG-рендеринг в Lottie Web основан на динамическом создании
DOM-дерева, где каждая анимационная сущность преобразуется в
SVG-элементы (<path>, <g>,
<mask>, <image> и т.д.). В отличие
от Canvas-рендерера, SVG остаётся частью DOM и наследует все свойства
веб-страницы: события, атрибуты, политики безопасности и потенциальные
точки внедрения скриптового кода.
Ключевая особенность SVG как вектора в DOM — возможность содержать активные конструкции. Это делает его естественной зоной риска при работе с любыми внешними или частично доверенными источниками анимации.
SVG, несмотря на визуальный характер, поддерживает ряд механизмов, которые могут быть использованы для исполнения нежелательного JavaScript-кода:
В SVG допустимы inline-обработчики:
onloadonerroronbeginonrepeatПример потенциально опасной конструкции:
<svg>
<script>alert(1)</script>
<image oner ror="alert(1)" />
</svg>
Даже если прямые <script> блоки блокируются,
события остаются значимым каналом.
href и
XLinkSVG поддерживает ссылки через href и устаревший
xlink:href. При некорректной фильтрации возможно
внедрение:
jav * ascript: URI<foreignObject> и
HTML-инъекцияforeignObject позволяет внедрять HTML внутри SVG:
<foreignObject>
<div xmlns="http://www.w3.org/1999/xhtml">
<img src="x" oner ror="alert(1)" />
</div>
</foreignObject>
Это один из наиболее опасных механизмов, так как переносит атаку из SVG в полноценный HTML-рендеринг.
SVG поддерживает встроенные стили:
<style>
@import url("jav * ascript:alert(1)");
</style>
Также возможно использование url() с внешними ресурсами,
приводящее к утечкам данных или загрузке вредоносного контента.
Библиотека Lottie Web (bodymovin) поддерживает несколько рендереров:
svgcanvashtmlSVG-режим наиболее уязвим, поскольку строит интерактивное DOM-дерево.
Основные точки загрузки данных:
lottie.loadAnimation({
container: element,
renderer: 'svg',
path: 'animation.json'
});
или
lottie.loadAnimation({
container: element,
renderer: 'svg',
animationData: data
});
Угроза возникает не из самого API, а из источника
animationData или удалённого JSON.
Критическая граница безопасности проходит по источнику JSON-анимации:
SVG-рендерер не различает происхождение данных — он только интерпретирует структуру.
Хотя Lottie формально использует JSON, внутри него могут присутствовать конструкции, влияющие на SVG:
assets)Поле p может указывать на внешние ресурсы:
Это создаёт риск SSRF-подобного поведения на клиенте и утечек через загрузку ресурсов.
Некоторые SVG-маски могут комбинироваться с внешними изображениями, создавая возможность:
Хотя expressions обычно вычисляются до экспорта, некоторые пайплайны могут сохранять динамические вычисления. В случае неправильной обработки:
Наиболее надёжный способ устранения SVG-XSS класса угроз:
lottie.loadAnimation({
container: element,
renderer: 'canvas',
animationData: data
});
Canvas полностью исключает DOM-инъекции, так как вывод представляет собой пиксельный буфер.
Если SVG обязателен, необходимо фильтровать результат до вставки в DOM.
Подходы:
on* атрибутов<script><foreignObject>href схемПример стратегии очистки:
path, g,
rect, circle, defsd, fill,
stroke, transformDOMPurify с SVG-режимом позволяет минимизировать риск XSS:
DOMPurify.sanitize(svgString, {
USE_PROFILES: { svg: true }
});
Дополнительные ограничения:
FORBID_TAGS: ['foreignObject', 'script']FORBID_ATTR: [/^on/i]CSP снижает ущерб даже при успешной инъекции:
unsafe-evalimg-src, object-src,
media-srcРекомендуемые директивы:
script-src 'self'object-src 'none'base-uri 'none'SVG-рендерер может инициировать запросы к:
Необходимо:
data: и jav * ascript: схемыДля минимизации последствий компрометации SVG-рендерера применяются архитектурные подходы:
Изоляция в sandboxed iframe:
Использование Shadow DOM снижает риск утечки событий и упрощает контроль над стилями, но не устраняет SVG-XSS полностью.
Перед передачей данных в Lottie Web выполняется строгая проверка:
Дополнительно:
layers)tyПрактика безопасных конфигураций включает:
filter эффектовSVG в Lottie Web должен рассматриваться как потенциально исполняемая среда, а не как статическая графика. Любая анимация:
Граница безопасности проходит не между JSON и SVG, а между доверенным и недоверенным источником данных.
Безопасный цикл обработки анимаций обычно включает:
innerHTML для SVG-строки