Использование свойства innerHTML в JavaScript позволяет
динамически изменять содержимое элементов HTML, включая вставку текста,
HTML-тегов и даже скриптов. Однако неконтролируемое применение этого
свойства создаёт риски безопасности, главным образом
связанные с XSS (Cross-Site Scripting). Библиотека Bliss.js
предоставляет удобные методы для работы с DOM, сохраняя совместимость с
привычными приёмами innerHTML, но при этом даёт возможности
минимизировать потенциальные угрозы.
innerHTML в Bliss.jsBliss.js упрощает работу с DOM через обёртки и удобные методы. Основной синтаксис для изменения содержимого элемента:
const el = Bliss.$('#container'); // Получение элемента через Bliss
el.html('<p>Привет, мир!</p>'); // Установка содержимого
Метод html() полностью заменяет содержимое элемента.
Важный момент — Bliss.js не фильтрует вставляемый HTML
автоматически. Любая строка с HTML-тегами или скриптами будет
вставлена напрямую, что делает использование данных из ненадёжных
источников опасным.
innerHTMLXSS возникает, когда пользовательский ввод вставляется в DOM без фильтрации, позволяя выполнить произвольный JavaScript. Пример уязвимости:
const userInput = '<img src=x oner ror=alert("XSS")>';
Bliss.$('#output').html(userInput);
В этом примере изображение с некорректным источником вызывает выполнение встроенного скрипта. Даже если вставляется текст, содержащий теги, браузер может интерпретировать их как HTML, что создаёт риск.
Для безопасной работы с текстом Bliss.js предоставляет метод
text(), который экранирует HTML-символы и предотвращает
интерпретацию как HTML:
const userInput = '<img src=x oner ror=alert("XSS")>';
Bliss.$('#output').text(userInput);
Результат будет отображён как обычный текст, а не как элемент DOM:
<img src=x oner ror=alert("XSS")>
Использование text() рекомендуется всегда при работе с
данными из внешних источников.
Иногда требуется вставить часть текста с базовым HTML-оформлением. В этом случае стоит использовать создание DOM-элементов вручную и методы Bliss.js для добавления содержимого:
const container = Bliss.$('#container');
const paragraph = Bliss.$('<p></p>').text(userInput); // безопасный текст
container.append(paragraph);
Такой подход позволяет вставлять текст безопасно и при этом сохранять структуру HTML.
Если необходимо разрешить ограниченный набор HTML-тегов (например,
<b>, <i>, <a>),
требуется очистка содержимого перед вставкой. Bliss.js
напрямую не предоставляет встроенный фильтр, поэтому используют внешние
утилиты или собственные функции:
function sanitize(html) {
const temp = document.createElement('div');
temp.textContent = html; // безопасное преобразование
return temp.innerHTML; // экранированный HTML
}
const safeHtml = sanitize(userInput);
Bliss.$('#output').html(safeHtml);
Такой метод экранирует все потенциально опасные символы, предотвращая выполнение скриптов.
Bliss.js поддерживает создание элементов из HTML-шаблонов с минимальным риском:
const template = Bliss.$('<div class="card"><h3></h3><p></p></div>');
template.find('h3').text(userTitle);
template.find('p').text(userDescription);
Bliss.$('#container').append(template);
Все данные вставляются через метод text(), что
исключает XSS, даже если значения содержат специальные
символы или HTML.
html().text().Bliss.$('<tag>') и методы text() или
attr() для установки атрибутов.innerHTML в Bliss.jsBliss.js не изменяет фундаментальные правила работы с DOM, но предоставляет удобные методы для безопасного манипулирования элементами. Основное внимание должно уделяться:
Следование этим практикам позволяет использовать динамический контент, не подвергая приложение риску XSS.