Ограничение выполнения экспрессий

В экосистеме Lottie экспрессии представляют собой потенциальный источник динамического поведения анимации, заимствованный из подхода Adobe After Effects. В контексте веб-рендеринга через Lottie Web выполнение экспрессий превращается из дизайнерского инструмента в область повышенного риска, поскольку любое вычисление, выходящее за рамки статической интерпретации JSON-анимации, фактически означает исполнение кода в рантайме.

Природа экспрессий в Lottie

Экспрессии в исходной среде After Effects — это JavaScript-подобные выражения, которые вычисляют значения свойств анимации на каждом кадре. При экспорте через bodymovin эти выражения могут:

  • быть преобразованы в ключевые кадры (bake / precompute),
  • быть проигнорированы,
  • либо (в ограниченных реализациях) сохранены как динамическая логика.

В Lottie Web отсутствует полноценная поддержка исполнения AE-экспрессий в том виде, в каком они существуют в редакторе. Однако архитектура формата допускает расширения и пользовательские интерпретаторы, что создаёт потенциальную поверхность выполнения кода.


Основные риски выполнения экспрессий

Исполнение динамических выражений в JSON-анимации приводит к ряду критических проблем:

1. Выполнение произвольного JavaScript-кода Если экспрессии интерпретируются через eval, Function или аналогичные механизмы, JSON-файл превращается в контейнер для кода.

2. Нарушение CSP (Content Security Policy) Любая попытка динамической компиляции кода конфликтует с политиками:

  • unsafe-eval
  • строгими nonce-based CSP

3. Инъекции через анимационные данные Lottie-файлы часто загружаются из внешних источников (CDN, пользовательский контент). Наличие выражений создаёт канал внедрения логики.

4. Нестабильность производительности Экспрессии, вычисляемые на каждом кадре, могут:

  • блокировать main thread
  • создавать утечки памяти через замыкания
  • вызывать деградацию FPS

Архитектурные подходы к ограничению экспрессий

Полное исключение экспрессий на этапе экспорта

Наиболее надёжная стратегия — удаление динамической логики до попадания в Lottie Web.

Типичный пайплайн:

  • After Effects проект
  • экспорт через bodymovin
  • bake expressions в keyframes

Результат — полностью детерминированный JSON без вычисляемых выражений.

Ключевой принцип: анимация должна быть функцией данных, а не функцией кода


Отключение интерпретации выражений на уровне рантайма

В некоторых конфигурациях Lottie Web или форках движка может присутствовать слой интерпретации свойств. Ограничение достигается через:

  • отключение expression engine (если присутствует в сборке)
  • замена вычисляемых функций на статические интерполяции
  • блокировка кастомных обработчиков свойств

Общий подход — исключение любых точек входа, где строка может быть интерпретирована как код.


Санация JSON-анимации

Перед передачей данных в Lottie runtime применяется фильтрация:

  • удаление полей, связанных с выражениями
  • проверка типов значений (строки vs числа vs объекты)
  • рекурсивная валидация структуры layers / properties

Особое внимание уделяется полям, которые потенциально могут содержать вычисляемые конструкции:

  • текстовые значения
  • эффекты
  • пользовательские свойства (custom props)

Изоляция вычислений

Если поддержка динамики необходима, применяется изоляция:

Web Worker sandbox

  • вычисление значений вне main thread
  • передача только результатов (чисел, массивов)

Изолированный scope

  • запрет доступа к window, document
  • предоставление ограниченного контекста (math-only API)

Proxy-обёртки

  • контроль доступа к объектам анимации
  • перехват попыток обращения к внешним данным

Защита от Function Constructor и eval

Одним из критических векторов является использование:

  • eval
  • new Function()
  • setTimeout(string)

Для ограничения применяются техники:

  • переопределение глобальных конструкторов в runtime окружении
  • использование CSP с запретом unsafe-eval
  • запуск Lottie в изолированном iframe sandbox
  • замена интерпретаторов выражений на заранее скомпилированные функции

Ограничение динамических свойств анимации

Даже без явных экспрессий JSON может содержать косвенную динамику:

  • выраженные зависимости opacity/position от других слоёв
  • ссылки на time-based функции
  • сложные easing-кривые с вычисляемыми параметрами

Ограничение достигается через нормализацию:

  • преобразование всех зависимостей в абсолютные keyframes
  • фиксация временной шкалы
  • запрет ссылок между слоями в рантайме

Валидация структуры Lottie JSON

Фильтрация экспрессий часто реализуется как часть схемы валидации:

  • проверка соответствия JSON schema
  • запрет строковых полей с подозрительными паттернами
  • ограничение глубины вложенности объектов
  • whitelist допустимых свойств

Пример ограничений:

  • допустимы только числовые transform-параметры
  • запрещены любые функции или строки, содержащие кодоподобные конструкции
  • удаляются неизвестные типы эффектов

Производительность как фактор ограничения

Даже безопасные выражения становятся проблемой при высокой частоте кадров.

Основные ограничения:

  • вычисления строго синхронны с рендер-циклом
  • любое выражение выполняется до отрисовки кадра
  • рост количества свойств увеличивает cost per frame линейно или экспоненциально

Практическое следствие — отказ от runtime-вычислений в пользу precomputed animation graph.


Ограничение доступа к внешнему окружению

При потенциальной поддержке выражений критически важно ограничить окружение исполнения:

  • отсутствие доступа к сетевым API
  • блокировка fetch, XMLHttpRequest
  • запрет доступа к storage
  • отсутствие доступа к DOM

Контекст исполнения должен сводиться к математическим операциям над входными значениями анимации.


Гибридный подход: безопасная динамика

В некоторых системах допускается ограниченная динамика без полного отказа от выражений:

  • математические функции (sin, cos, clamp, lerp)
  • параметры времени (frame, time)
  • локальные переменные слоя

При этом:

  • отсутствует строковый парсинг кода
  • отсутствует доступ к глобальной среде
  • выражения представлены в виде AST, а не текста

Такой подход устраняет классические уязвимости JavaScript-интерпретации.


Стратегии проектирования безопасных Lottie-анимаций

Проектирование анимации с учётом ограничения экспрессий опирается на несколько принципов:

  • детерминированность всех параметров
  • отсутствие вычислений на основе внешнего состояния
  • перенос логики в инструменты сборки, а не в runtime
  • использование keyframes как единственного источника истины

Любая необходимость “условной логики” рассматривается как сигнал к выносу поведения за пределы Lottie Web слоя.