Cross-Site Scripting (XSS) — это уязвимость веб-приложений, при которой злоумышленник может внедрить в страницу вредоносный скрипт. Этот скрипт выполняется в браузере жертвы и может похищать данные, управлять сессиями или изменять контент страницы. XSS встречается в нескольких формах:
Основная причина XSS — некорректная обработка пользовательского ввода и непосредственная вставка данных в HTML или JavaScript.
Slim.js — это лёгкая библиотека для создания веб-компонентов и реактивного интерфейса. Несмотря на её компактность, она предоставляет инструменты для безопасной работы с данными и предотвращения инъекций.
Метод text При вставке динамического
контента в DOM рекомендуется использовать свойство text,
которое автоматически экранирует HTML-символы.
let message = "<script>alert('XSS');</script>";
let app = new Slim({
element: '#container',
template: `<div>{{text message}}</div>`,
data: {
message
}
});
В этом примере символы <, > и
" преобразуются в HTML-сущности, и скрипт не
выполнится.
Метод html и осторожность с ним
Использование html позволяет вставлять сырой HTML, но это
опасно при работе с пользовательским вводом. Любой HTML-фрагмент должен
быть тщательно проверен или очищен:
let safeContent = sanitizeHTML(userInput); // библиотека или собственная функция
<div>{{html safeContent}}</div>
Не следует напрямую использовать html с необработанными
данными, полученными от пользователей.
Slim.js реализует реактивность через свойства компонентов. Любые
данные, связываемые с DOM через двойные фигурные скобки
{{}}, автоматически проходят через систему рендеринга
Slim.js.
Пример безопасного связывания:
let app = new Slim({
element: '#app',
data: {
userComment: ''
},
template: `
<div>{{text userComment}}</div>
`
});
Любое обновление userComment не приведёт к выполнению
скриптов.
События в Slim.js, привязанные через on:event,
безопасны, если обработчики не создаются динамически из
пользовательского ввода.
<button on:click="handleClick">Нажми</button>
Ни в коем случае не генерировать функции из строки, полученной от пользователя:
// Опасно!
let dynamicHandler = new Function(userInput);
Такая практика напрямую открывает путь к DOM-based XSS.
Даже при использовании Slim.js рекомендуется:
<, >, ", '
должны преобразовываться в сущности.Пример интеграции DOMPurify с Slim.js:
import DOMPurify from 'dompurify';
let userContent = "<img src=x oner ror=alert(1)>";
let safeContent = DOMPurify.sanitize(userContent);
<div>{{html safeContent}}</div>
Slim.js позволяет комбинировать текст, HTML и выражения внутри
шаблона. Основное правило — не вставлять непроверенные данные в
HTML, использовать text для отображения текста и только
проверенный HTML через html.
innerHTML напрямую.Для сложных приложений рекомендуется:
html с небезопасными источниками.Такая системная практика сводит риск XSS к минимуму и позволяет создавать безопасные реактивные интерфейсы.