Библиотека Cash предоставляет удобный и компактный API для работы с DOM в стиле jQuery. При работе с пользовательским контентом необходимо учитывать, что любые операции с HTML, вводимым пользователем, могут стать источником XSS-уязвимостей (Cross-Site Scripting). Даже при использовании удобных методов манипуляции DOM важно различать безопасные и небезопасные подходы.
.html()
и .append()Методы .html() и .append() позволяют
добавлять в DOM как строки HTML, так и элементы.
Пример использования:
const userInput = '<div>Пример контента</div>';
cash('#container').html(userInput);
Опасность: если userInput приходит от
пользователя, он может содержать вредоносный скрипт:
const userInput = '<img src=x oner ror=alert(1)>';
cash('#container').html(userInput);
Рекомендация: избегать вставки непроверенного HTML. Предпочтительно использовать методы, работающие с текстом:
cash('#container').text(userInput); // безопасная вставка
Метод .text() автоматически экранирует специальные
символы (<, >, &),
предотвращая выполнение скриптов.
Cash позволяет создавать элементы из HTML:
const element = cash('<div class="item">Контент</div>');
cash('#list').append(element);
При создании элементов из строки HTML важно удостовериться, что она не содержит пользовательских скриптов. Для динамически генерируемого пользовательского контента лучше использовать создание элементов через объектный синтаксис:
const element = cash('<div>').addClass('item').text(userInput);
cash('#list').append(element);
Такой подход безопасен, так как метод .text() экранирует
любые потенциально опасные символы.
.attr()Метод .attr() позволяет читать и задавать атрибуты
элементов. Здесь также возможны уязвимости:
const userUrl = 'jav * ascript:alert(1)';
cash('a').attr('href', userUrl);
Опасность: установка атрибутов вроде
href или src напрямую может привести к
выполнению вредоносного кода.
Рекомендации по безопасной работе с атрибутами:
http:// или
https://:function sanitizeUrl(url) {
return url.startsWith('http://') || url.startsWith('https://') ? url : '#';
}
cash('a').attr('href', sanitizeUrl(userUrl));
.attr()
(onclick, onerror) — использовать методы Cash
для привязки событий .on()..on() и .off()Методы .on() и .off() безопасны для работы
с пользовательским контентом, так как они не требуют вставки строкового
кода:
cash('#button').on('click', () => alert('Нажато'));
Преимущества:
onclick в HTML..off().При работе с пользовательским контентом важно отделять:
Пример безопасного рендеринга списка:
const users = ['Alice', 'Bob', '<script>alert(1)</script>'];
users.forEach(user => {
const li = cash('<li>').text(user); // безопасно
cash('#userList').append(li);
});
Даже если в массиве окажется вредоносный скрипт, метод
.text() предотвратит его выполнение.
При динамическом формировании HTML лучше использовать
DocumentFragment или методы Cash, комбинируя
.text() и .append():
const fragment = document.createDocumentFragment();
users.forEach(user => {
const li = cash('<li>').text(user);
fragment.appendChild(li[0]); // li[0] — нативный DOM-элемент
});
cash('#userList')[0].appendChild(fragment);
Такой подход:
.text() безопасен для всех вставок
пользовательского текста..html() и .append()
безопасны только при проверенном HTML..attr() требует фильтрации и валидации
атрибутов, особенно URL..on() безопасен для привязки событий и
должен использоваться вместо встроенных обработчиков.Применение этих принципов обеспечивает защиту от XSS и сохраняет удобство работы с DOM через Cash.