Noty — это легковесная библиотека для создания уведомлений в
браузере, которая поддерживает динамическое содержимое через строки
HTML. Одной из ключевых особенностей является возможность передавать
HTML-код в параметре text при создании уведомления:
new Noty({
text: '<strong>Успех!</strong> Данные сохранены',
type: 'success',
timeout: 3000
}).show();
При использовании HTML-контента необходимо учитывать, что любой
пользовательский ввод, напрямую вставляемый в text, может
стать источником XSS-уязвимостей. Noty не выполняет
автоматическое экранирование HTML, поэтому ответственность за
безопасность лежит на разработчике.
XSS (Cross-Site Scripting) возникает, когда вредоносный код внедряется в веб-страницу и исполняется на стороне клиента. В контексте Noty это может произойти, если динамические данные из внешних источников вставляются в уведомление без очистки. Пример потенциально уязвимого кода:
const userMessage = getUserInput(); // Получено от пользователя
new Noty({
text: userMessage,
type: 'alert',
timeout: 5000
}).show();
Если userMessage содержит строку вроде
<script>alert('XSS');</script>, этот скрипт
выполнится в браузере, создавая угрозу безопасности.
Для предотвращения XSS рекомендуется:
<, >, &,
", ' на безопасные аналоги
(<, >, &,
", ').function escapeHtml(str) {
return str.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
}
const safeMessage = escapeHtml(userMessage);
new Noty({
text: safeMessage,
type: 'alert',
timeout: 5000
}).show();
text без
тегов:new Noty({
text: "Сообщение от пользователя",
type: 'information',
timeout: 4000
}).show();
import DOMPurify from 'dompurify';
const cleanHtml = DOMPurify.sanitize(userMessage);
new Noty({
text: cleanHtml,
type: 'success',
timeout: 3000
}).show();
Noty поддерживает разные типы уведомлений (alert,
success, error, warning,
information). Каждый тип визуально выделяется и может
использоваться для разных уровней важности. При работе с
пользовательским вводом особенно важно контролировать содержимое
уведомлений типа alert и error, так как они
привлекают внимание и потенциально могут быть использованы для фишинга
или распространения вредоносного HTML-кода.
text — основной источник потенциальных
инъекций. Любой HTML-код передается напрямую в DOM.type — влияет на стили уведомления, не
влияет на безопасность.layout и theme —
визуальные настройки, безопасны при стандартной конфигурации.modal и killer —
управляют поведением уведомлений, но не фильтруют контент.Важный принцип: любые данные, поступающие извне, должны проходить
фильтрацию перед вставкой в text.
const messageData = {
userName: escapeHtml(user.name),
action: 'создал новый пост'
};
const notificationHtml = `<strong>${messageData.userName}</strong> ${messageData.action}`;
new Noty({
text: notificationHtml,
type: 'success',
timeout: 4000
}).show();
В этом примере HTML формируется только из безопасных элементов, а пользовательские данные предварительно экранируются.
Эти практики позволяют безопасно интегрировать Noty в веб-приложения, минимизируя риски HTML-инъекций и XSS.