Tippy.js позволяет создавать всплывающие подсказки и тултипы с высокой степенью гибкости, включая возможность отображения HTML-контента внутри тултипов. При использовании HTML-контента важно учитывать вопросы безопасности, чтобы избежать уязвимостей XSS (Cross-Site Scripting). Для этого Tippy.js предоставляет встроенные механизмы и рекомендации по санитизации HTML.
По умолчанию Tippy.js принимает текстовые значения через опцию
content. Для HTML-контента необходимо использовать свойство
allowHTML:
tippy('#myButton', {
content: '<strong>Важная подсказка</strong>',
allowHTML: true
});
allowHTML: true — разрешает вставку HTML-кода.allowHTML все HTML-теги будут
экранированы, что предотвращает потенциальные XSS-атаки.Использование allowHTML: true открывает возможность
выполнения вредоносного кода, если содержимое берется
из ненадежных источников. Например:
const userContent = '<img src=x oner ror=alert("XSS")>';
tippy('#userButton', {
content: userContent,
allowHTML: true
});
В этом случае злоумышленник может внедрить JavaScript, который выполнится в контексте страницы.
import DOMPurify from 'dompurify';
const unsafeContent = '<img src=x oner ror=alert("XSS")>';
const safeContent = DOMPurify.sanitize(unsafeContent);
tippy('#secureButton', {
content: safeContent,
allowHTML: true
});
DOMPurify.sanitize() удаляет скрипты,
onerror и другие опасные атрибуты.<strong>, <em>,
<a> и др.) без угрозы безопасности.content,
что снижает риск внедрения скриптов:const tooltipNode = document.createElement('div');
tooltipNode.innerHTML = '<strong>Безопасная подсказка</strong>';
tippy('#domButton', {
content: tooltipNode,
allowHTML: true
});
DOMPurify для динамического
контента.interactive и appendToTippy.js предоставляет дополнительные опции, влияющие на обработку HTML:
interactive: true — позволяет
пользователю взаимодействовать с HTML-контентом, например кликать по
ссылкам или кнопкам внутри тултипа.appendTo: document.body —
рекомендуемое значение для сложных HTML-структур, чтобы тултип не
наследовал стили или скрипты из родительских контейнеров.Пример безопасной комбинации:
tippy('#interactiveButton', {
content: DOMPurify.sanitize('<a href="#">Ссылка</a>'),
allowHTML: true,
interactive: true,
appendTo: document.body
});
Tippy.js позволяет обновлять контент тултипа после инициализации
через метод .setContent():
const tip = tippy('#dynamicButton', {
content: '',
allowHTML: true
});
function updateTooltip(userInput) {
const sanitized = DOMPurify.sanitize(userInput);
tip[0].setContent(sanitized);
}
DOMPurify.sanitize(unsafeContent, {
ALLOWED_TAGS: ['b', 'i', 'strong', 'em', 'a'],
ALLOWED_ATTR: ['href', 'title']
});
Контроль ссылок Для ссылок
<a> рекомендуется добавлять
rel="noopener noreferrer" и target="_blank"
при необходимости.
Избегание inline-скриптов Никогда не вставлять
содержимое с тегами <script> или атрибутами типа
on*.
allowHTML: true — разрешает HTML.interactive и appendTo для сложных
тултипов..setContent() с санитизацией.Эти подходы обеспечивают баланс между функциональностью HTML в тултипах и безопасностью приложения, предотвращая внедрение вредоносного кода.