Sanitization данных является критически важной частью разработки веб-компонентов, обеспечивая защиту от XSS-атак и некорректного отображения пользовательского контента. В контексте FAST Element задача санитизации включает очистку динамически вставляемого HTML, управление атрибутами и безопасное связывание данных с шаблонами.
FAST Element — это библиотека для создания высокопроизводительных веб-компонентов на базе стандартов Web Components. Основные строительные блоки включают:
FASTElement — базовый класс для
создания компонентов.html — функция для декларативного
описания шаблонов.css — поддержка стилевой
инкапсуляции.Динамическое вставление данных в шаблон через привязки может быть потенциально опасным, если данные поступают из ненадёжного источника.
Использование конструкции:
html`<div>${userInput}</div>`
без предварительной обработки может привести к выполнению
вредоносного кода. Например, если userInput содержит
<script>alert('XSS')</script>, он будет
выполнен при рендеринге. В FAST Element по умолчанию строки
интерполируются безопасно: специальные символы (<,
>, &, ") автоматически
экранируются. Это предотвращает большинство атак через стандартные
текстовые привязки.
unsafeHTMLДля случаев, когда требуется вставка полноценного HTML, используется
директива unsafeHTML:
import { html } from "@microsoft/fast-element";
import { unsafeHTML } from "@microsoft/fast-element/lit-html/directives/unsafe-html.js";
html`<div>${unsafeHTML(userInput)}</div>`
Эта директива не выполняет санитизацию — вставляемый
HTML будет интерпретирован браузером напрямую. Использование
unsafeHTML должно сопровождаться:
Пример безопасной вставки:
import DOMPurify from "dompurify";
const sanitizedHTML = DOMPurify.sanitize(userInput);
html`<div>${unsafeHTML(sanitizedHTML)}</div>`;
FAST Element поддерживает привязку атрибутов через двоеточие:
html`<img src="${imageSrc}" alt="${imageAlt}">`
href:html`<a href="${userLink}">Ссылка</a>`
Чтобы предотвратить открытие вредоносных URL, рекомендуется проверять
схему (http, https) и блокировать
jav * ascript: или другие потенциально опасные протоколы.
Пример фильтрации ссылок:
function sanitizeUrl(url) {
try {
const parsed = new URL(url, window.location.origin);
return parsed.protocol === "http:" || parsed.protocol === "https:" ? parsed.href : "#";
} catch {
return "#";
}
}
html`<a href="${sanitizeUrl(userLink)}">Ссылка</a>`;
FAST Element позволяет привязывать обработчики событий прямо в шаблоне:
html`<button @click="${this.onClick}">Клик</button>`
Если обработчик генерируется динамически на основе пользовательских данных, необходимо убедиться, что данные не подставляются в качестве имени функции или кода. Использование привязок через методы класса предотвращает внедрение произвольного JavaScript.
Слоты и динамические компоненты — ещё одна область, где важна
санитизация. Вставка контента через <slot> безопасна,
так как FAST Element обрабатывает текст автоматически, но динамическая
генерация компонентов через фабрики требует проверки:
const componentType = getComponentType(userInput); // небезопасно, если userInput произвольный
Рекомендуется использовать черные и белые списки допустимых компонентов и избегать прямой зависимости от пользовательского ввода.
unsafeHTML требует явной очистки
данных через проверенные библиотеки.Соблюдение этих правил гарантирует, что компоненты FAST Element будут защищены от большинства XSS-атак и некорректной интерпретации данных.