Tooltipster позволяет отображать сложные HTML-подсказки поверх элементов страницы. Однако при работе с HTML-контентом важно учитывать безопасность: небезопасный или непроверенный HTML может привести к XSS-уязвимостям. Для защиты используется санитизация HTML, которая предотвращает выполнение вредоносных скриптов.
Tooltipster по умолчанию позволяет вставлять HTML-контент через опцию
content или атрибут title. Для включения
полноценной поддержки HTML необходимо указать параметр:
$('.tooltip').tooltipster({
content: $('<div><strong>Сильный заголовок</strong><p>Описание подсказки</p></div>'),
contentAsHTML: true,
interactive: true,
theme: 'tooltipster-shadow'
});
Ключевые моменты:
contentAsHTML: true — позволяет рендерить HTML вместо
простого текста.interactive: true — делает подсказку интерактивной,
чтобы в ней можно было размещать ссылки, кнопки и другие элементы
управления.theme — визуальное оформление подсказки.Если contentAsHTML не включен, все HTML-теги будут
экранированы и отображены как текст.
HTML, передаваемый напрямую, может содержать:
<script>-теги или inline-скрипты.on* (например, onclick,
onmouseover) с вредоносным кодом.<iframe> или
<img> с опасными URL.Непроверенный HTML может привести к XSS, утечке данных или манипуляции DOM.
Tooltipster не выполняет автоматическую очистку HTML. Для безопасной работы используют внешние библиотеки:
const unsafeHTML = '<img src=x oner ror=alert(1)><p>Безопасный текст</p>';
const safeHTML = DOMPurify.sanitize(unsafeHTML);
$('.tooltip').tooltipster({
content: $(safeHTML),
contentAsHTML: true
});
DOMPurify.sanitize() удаляет все потенциально опасные
элементы и атрибуты.<b>,
<i>, <a> и другие безопасные
теги.Позволяет более тонко настраивать правила очистки:
const cleanHTML = sanitizeHtml(unsafeHTML, {
allowedTags: ['b', 'i', 'em', 'strong', 'a', 'p'],
allowedAttributes: {
'a': ['href', 'title', 'target']
}
});
$('.tooltip').tooltipster({
content: $(cleanHTML),
contentAsHTML: true
});
sanitize в момент
формирования подсказки.interactive: true для элементов
управления в подсказке, чтобы пользователь мог взаимодействовать с
безопасным контентом без риска исполнения скриптов.При подгрузке HTML через AJAX важно интегрировать санитизацию на лету:
$.get('/tooltip/content', function(data) {
const safeContent = DOMPurify.sanitize(data);
$('.tooltip').tooltipster('content', $(safeContent));
});
Особое внимание уделяется ссылкам:
jav * ascript: в href.rel="noopener noreferrer" для внешних
ссылок.const safeHTML = DOMPurify.sanitize(unsafeHTML, {
ALLOWED_URI_REGEXP: /^https?:\/\//
});
ALLOWED_URI_REGEXP ограничивает URL только безопасными
протоколами.Санитизированный HTML можно комбинировать с любыми темами Tooltipster, сохраняя дизайн:
$('.tooltip').tooltipster({
content: $(DOMPurify.sanitize(ajaxContent)),
contentAsHTML: true,
theme: 'tooltipster-light',
animation: 'fade',
delay: 200
});
Использование санитизации HTML-контента в Tooltipster обеспечивает баланс между функциональностью подсказок и безопасностью веб-приложения, позволяя безопасно отображать сложные интерактивные элементы без риска XSS.