Плагин

Безопасность

Редактор строится так, чтобы контент письма, обмен данными с хост-страницей и чувствительные настройки были отделены от окружения интегратора и предсказуемо обрабатывались. Ниже — основные механизмы и что они дают.

1. Изоляция канваса письма (iframe)

Разметка и логика редактирования письма живут во вложенном iframe с отдельным document. Это отделяет DOM/CSS письма от страницы-хоста: стили сайта не «протекают» в письмо и наоборот, снижается риск случайного вмешательства со скриптов родительской страницы в дерево редактора.

На iframe предпросмотра/редактора навешивается атрибут sandbox с явным списком разрешений (скрипты, навигация, попапы и т.д.) — это ограничивает возможности документа внутри фрейма по сравнению с обычной вкладкой.

Интегратору: безопасность хост-страницы по-прежнему ваша зона ответственности: XSS на родителе может скомпрометировать страницу целиком, включая обёртку плагина.

2. Контроль канала postMessage: привязка к event.source

Обмен между родителем и iframe идёт через postMessage. В ядре используется MessageService: входящее сообщение обрабатывается только если event.source совпадает с заранее сохранённой ссылкой на окно (Window) — ожидаемым родителем или ожидаемым contentWindow iframe.

Так снижается риск обработки сообщений от посторонних окон на той же странице (другой iframe, всплывающее окно и т.п.): канал привязан не к «любому сообщению», а к конкретной паре окон.

Отправка в сторону iframe может использовать targetOrigin: '*' — это распространённый компромисс для сборок с разными базовыми URL; фильтрация по source при приёме остаётся основным контролем на уровне приложения.

Интегратору: при жёстких политиках безопасности можно дополнительно согласовать фиксированные origin и проверки на своей стороне.

3. «Белый список» операций в sandbox

Внутри iframe сообщения с полем operation обрабатываются только если для операции зарегистрирован обработчик. Неизвестная операция не исполняется произвольным кодом — это уменьшает поверхность атаки через подбор имён команд.

4. Санитизация опасного HTML при вводе

Вставка из буфера обмена проходит через sanitize-html: разрешены только оговорённые теги и атрибуты, для ссылок ограничиваются схемы URL (например httphttpsmailto), что сужает класс XSS и вредоносных протоколов при paste.

Отдельно от этого при выводе/синхронизации контента используется фильтрация разметки (в т.ч. emFilter): убираются служебные элементы и атрибуты редактора (редактируемость, внутренние классы, временные узлы), нормализуется структура — чтобы в экспорт не попадал «мусор» и внутренние детали UI редактора.

5. Парсинг и работа с DOM

HTML в критичных путях разбирается через контролируемый парсинг (parseFromString / построение дерева) и последующие преобразования DOM, а не через безусловную подстановку непроверенной строки в innerHTML во всех сценариях — это снижает класс ошибок и упрощает контроль над тем, что реально оказывается в документе.

6. Конфиденциальность и телеметрия: preventSendDataToEM

В config доступен флаг preventSendDataToEM: при включении часть сценариев не отправляет данные в сервисы EmailMaker (снижение утечек метаданных и привязки к облаку там, где интеграция должна быть автономной или изолированной). Точное поведение зависит от версии и связанных модулей; для юридических требований имеет смысл уточнить политику в актуальной документации API.

Краткая таблица для справки

МеханизмНазначение
Отдельный iframe для редактораИзоляция DOM/CSS письма от хост-страницы
sandbox на iframeОграничение возможностей встроенного документа браузером
MessageService + проверка event.sourceПриём postMessage только от ожидаемого окна
Регистрация обработчиков по operationНет выполнения произвольных команд по строке операции
sanitize-html на pasteWhitelist тегов/атрибутов и схем ссылок
emFilter и родственная очисткаУдаление служебной разметки редактора перед выдачей HTML
preventSendDataToEMСнижение отправки данных на сторону EmailMaker (privacy)

Что важно понимать интегратору

Безопасность — слоёный подход: изоляция iframe, фильтрация сообщений по источнику, санитизация ввода и очистка экспорта дополняют друг друга, но не заменяют безопасную вёрстку и Content-Security-Policy на вашем домене, корректную авторизацию API и защиту токенов на бэкенде. Плагин рассчитан на работу в доверенном контексте встраивания; при повышенных требованиях согласуйте с командой продукт жёсткие origin для messaging и политику хранения контента.