В экосистеме Lottie экспрессии представляют собой потенциальный источник динамического поведения анимации, заимствованный из подхода Adobe After Effects. В контексте веб-рендеринга через Lottie Web выполнение экспрессий превращается из дизайнерского инструмента в область повышенного риска, поскольку любое вычисление, выходящее за рамки статической интерпретации JSON-анимации, фактически означает исполнение кода в рантайме.
Экспрессии в исходной среде After Effects — это JavaScript-подобные выражения, которые вычисляют значения свойств анимации на каждом кадре. При экспорте через bodymovin эти выражения могут:
В Lottie Web отсутствует полноценная поддержка исполнения AE-экспрессий в том виде, в каком они существуют в редакторе. Однако архитектура формата допускает расширения и пользовательские интерпретаторы, что создаёт потенциальную поверхность выполнения кода.
Исполнение динамических выражений в JSON-анимации приводит к ряду критических проблем:
1. Выполнение произвольного JavaScript-кода Если
экспрессии интерпретируются через eval,
Function или аналогичные механизмы, JSON-файл превращается
в контейнер для кода.
2. Нарушение CSP (Content Security Policy) Любая попытка динамической компиляции кода конфликтует с политиками:
unsafe-eval3. Инъекции через анимационные данные Lottie-файлы часто загружаются из внешних источников (CDN, пользовательский контент). Наличие выражений создаёт канал внедрения логики.
4. Нестабильность производительности Экспрессии, вычисляемые на каждом кадре, могут:
Наиболее надёжная стратегия — удаление динамической логики до попадания в Lottie Web.
Типичный пайплайн:
Результат — полностью детерминированный JSON без вычисляемых выражений.
Ключевой принцип: анимация должна быть функцией данных, а не функцией кода
В некоторых конфигурациях Lottie Web или форках движка может присутствовать слой интерпретации свойств. Ограничение достигается через:
Общий подход — исключение любых точек входа, где строка может быть интерпретирована как код.
Перед передачей данных в Lottie runtime применяется фильтрация:
Особое внимание уделяется полям, которые потенциально могут содержать вычисляемые конструкции:
Если поддержка динамики необходима, применяется изоляция:
Web Worker sandbox
Изолированный scope
window, documentProxy-обёртки
Одним из критических векторов является использование:
evalnew Function()setTimeout(string)Для ограничения применяются техники:
unsafe-evalДаже без явных экспрессий JSON может содержать косвенную динамику:
Ограничение достигается через нормализацию:
Фильтрация экспрессий часто реализуется как часть схемы валидации:
Пример ограничений:
Даже безопасные выражения становятся проблемой при высокой частоте кадров.
Основные ограничения:
Практическое следствие — отказ от runtime-вычислений в пользу precomputed animation graph.
При потенциальной поддержке выражений критически важно ограничить окружение исполнения:
fetch, XMLHttpRequestКонтекст исполнения должен сводиться к математическим операциям над входными значениями анимации.
В некоторых системах допускается ограниченная динамика без полного отказа от выражений:
При этом:
Такой подход устраняет классические уязвимости JavaScript-интерпретации.
Проектирование анимации с учётом ограничения экспрессий опирается на несколько принципов:
Любая необходимость “условной логики” рассматривается как сигнал к выносу поведения за пределы Lottie Web слоя.