XSS (Cross-Site Scripting) — это уязвимость веб-приложений, при которой злоумышленник может внедрить и выполнить вредоносный скрипт в контексте браузера пользователя. XSS позволяет:
Существует три основных типа XSS: Reflected, Stored и DOM-based.
XSS-атаки используют возможности браузера по интерпретации HTML и JavaScript. Основные векторы:
<input>).innerHTML или document.write
для динамического контента.Пример опасного кода на Jav * aScript:
const userInput = location.search.split('name=')[1];
document.getElementById('greeting').innerHTML = `Привет, ${userInput}!`;
Если userInput содержит
<script>alert('XSS')</script>, скрипт
выполнится.
Все данные, выводимые в HTML, должны быть экранированы. Это предотвращает интерпретацию специальных символов браузером. Примеры:
& → &< → <> → >" → "' → 'В JavaScript безопаснее использовать методы, работающие с текстом, а не HTML:
document.getElementById('greeting').textContent = userInput;
В HTML, JavaScript, CSS и URL есть свои контексты, в которых XSS проявляется по-разному. Для каждого контекста применяются отдельные правила:
textContent
вместо innerHTML.setAttribute и
экранировать специальные символы.encodeURIComponent.style или фильтровать значения.CSP позволяет ограничить источники выполнения скриптов и загрузки ресурсов. Пример строгой политики:
Content-Security-Policy: default-src 'self'; script-src 'self'; object-src 'none';
Это блокирует выполнение встроенных скриптов и подключение внешних, предотвращая многие виды XSS.
<script>,
<iframe>), атрибуты (onload,
onclick) и протоколы (jav * ascript:).Umbrella JS предоставляет лёгкий API для работы с DOM. При использовании функций библиотеки необходимо учитывать XSS-риски:
Методы .text() безопасны для вывода пользовательских
данных:
u('#greeting').text(userInput);
Это автоматически экранирует все специальные символы.
Метод .html() позволяет вставлять HTML, но не фильтрует
опасные скрипты:
u('#content').html('<p>' + userInput + '</p>'); // Опасно!
Если вставляется контент от пользователя, нужно использовать сторонние функции для очистки или ограничивать допустимые теги.
u('a.link').attr('href', safeUrl);
При установке URL следует проверять схему и кодировать параметры.
Подключение обработчиков через Umbrella JS безопаснее, чем вставка
onclick в HTML:
u('#button').on('click', () => {
console.log('Кнопка нажата');
});
Прямое использование HTML-атрибутов событий уязвимо к XSS.
.text() вместо
.html(), когда это возможно..html() применять проверку и очистку
данных.Эти меры формируют многослойную защиту, минимизируют риск XSS и повышают устойчивость веб-приложения к атакам.