Featherlight — это лёгкая и минималистичная библиотека для создания
модальных окон (lightbox) на основе jQuery. Она обеспечивает быстрый и
простой способ отображения изображений, HTML-контента или AJAX-запросов
в модальном окне без необходимости подключения громоздких фреймворков.
Основной принцип работы Featherlight заключается в том, что контент
динамически вставляется в DOM внутри специально создаваемого контейнера
с классом .featherlight.
Инициализация и базовое использование осуществляется
через вызов метода $.featherlight():
$.featherlight('<p>Пример текста в модальном окне</p>');
Также поддерживается привязка к элементам на странице с использованием селекторов:
$('a.lightbox').featherlight();
В этом случае содержимое href ссылки автоматически
загружается в модальное окно.
Featherlight поддерживает несколько типов контента, каждый из которых может быть источником потенциальных XSS-уязвимостей:
data-featherlight.<img> элементы с src, который берётся из
href.Каждый тип контента требует отдельного внимания при вопросах безопасности.
Основная уязвимость Featherlight возникает при работе с динамическим контентом, особенно когда:
$.featherlight() с входящими
данными из внешних источников.Пример опасного кода:
$.featherlight('<div>' + externalData + '</div>');
Если externalData содержит
<script>alert('XSS');</script>, скрипт
выполнится при вставке в DOM.
Чтобы избежать XSS, необходимо разделять текст и HTML. Featherlight позволяет безопасно вставлять текст с помощью jQuery:
$.featherlight($('<div>').text(externalData));
Метод .text() автоматически экранирует специальные
символы (<, >, &) и
предотвращает выполнение скриптов.
Если необходимо вставлять HTML, его нужно фильтровать. Примеры популярных библиотек:
Пример с DOMPurify:
var cleanHTML = DOMPurify.sanitize(externalHTML);
$.featherlight(cleanHTML);
Это гарантирует, что никакие <script> или
on* события не будут выполнены.
AJAX-контент особенно опасен, если сервер возвращает HTML. Рекомендуется:
.text() или фильтровать через
DOMPurify.Пример безопасной вставки AJAX:
$.get('/api/content', function(data) {
var safeHTML = DOMPurify.sanitize(data.html);
$.featherlight(safeHTML);
});
iFrame создаёт отдельный контекст, что снижает риск выполнения внешнего скрипта в основном DOM. Для усиления безопасности:
sandbox и
referrerpolicy.allow-scripts только при
необходимости.Пример:
$.featherlight('<iframe src="https://trusted-site.com" sandbox="allow-same-origin"></iframe>');
persist — при значении true сохраняет DOM
после закрытия модального окна. Вставка непроверенного контента в такой
контейнер увеличивает риск XSS.afterContent — колбэк, который вызывается после вставки
контента. Необходимо быть осторожным с манипуляцией DOM внутри этого
колбэка.Пример безопасного использования afterContent:
$.featherlight('<div></div>', {
afterContent: function() {
this.$content.text(externalData);
}
});
Эти меры минимизируют риск выполнения нежелательных скриптов и сохраняют безопасность приложения при работе с Featherlight.