Tippy.js — это библиотека для создания всплывающих подсказок и тултипов в JavaScript. Одним из критических аспектов её использования является безопасная работа с пользовательским вводом, чтобы предотвратить уязвимости типа XSS (Cross-Site Scripting) и другие потенциальные угрозы.
contentКлючевым свойством при создании тултипа является
content. Оно определяет, что будет отображаться во
всплывающей подсказке:
tippy('#button', {
content: 'Простой текст тултипа'
});
Если значение content формируется на основе
пользовательского ввода, важно не вставлять его напрямую в DOM без
обработки. Например:
const userInput = '<img src=x oner ror=alert(1)>';
tippy('#button', {
content: userInput // Опасно
});
В этом случае выполнение скрипта из пользовательского ввода приведёт к XSS. Для безопасного использования необходимо экранировать HTML-теги.
Tippy.js поддерживает HTML-контент через опцию
allowHTML:
tippy('#button', {
content: '<strong>Текст с HTML</strong>',
allowHTML: true
});
Если используется пользовательский ввод, необходимо использовать
функцию очистки, например, через
DOMPurify:
import DOMPurify from 'dompurify';
const safeContent = DOMPurify.sanitize(userInput);
tippy('#button', {
content: safeContent,
allowHTML: true
});
Это гарантирует удаление всех опасных скриптов и атрибутов из пользовательского ввода.
Для динамических подсказок безопаснее использовать функцию:
tippy('#button', {
content: () => DOMPurify.sanitize(getUserInput())
});
Такой подход позволяет каждый раз перед показом тултипа безопасно обрабатывать новые данные.
Если тултип содержит интерактивные элементы (например, кнопки или формы), нужно учитывать:
interactive: true позволяет взаимодействовать
с контентом тултипа.innerHTML для вставки скриптов.DOMPurify или аналогичные библиотеки.Пример:
tippy('#button', {
content: DOMPurify.sanitize('<button id="action">Клик</button>'),
allowHTML: true,
interactive: true,
onShown(instance) {
instance.popper.querySelector('#action').addEventListener('click', () => {
console.log('Кнопка нажата');
});
}
});
appendTo и
безопасность DOMTippy.js позволяет указывать контейнер для тултипа через
appendTo:
tippy('#button', {
content: 'Тултип в body',
appendTo: document.body
});
Важно убедиться, что пользовательский HTML не вставляется в произвольный узел DOM без очистки. Непроверенный контент может распространять XSS и ломать структуру документа.
При использовании Tippy.js с фреймворками (React, Vue, Angular):
v-html или
[innerHTML] с небезопасными данными.allowHTML: true только там, где это
действительно необходимо.content → всегда санитизировать пользовательский
ввод.allowHTML → включать только при необходимости, с
обработкой через безопасный sanitizer.interactive → использовать осторожно, назначая события
безопасно.appendTo → контролировать узел DOM, чтобы предотвратить
внедрение кода.Эти принципы обеспечивают безопасное использование Tippy.js при работе с любыми пользовательскими данными, предотвращая XSS и другие уязвимости, связанные с внедрением непроверенного HTML и скриптов.