Сценарии работы с вводом в веб-приложениях с использованием Cleave.js часто воспринимаются как исключительно фронтенд-задача форматирования, однако именно на этом уровне нередко формируются условия для XSS-уязвимостей. Форматирование телефонных номеров, дат, валют и произвольных масок меняет поведение DOM-ввода, но не отменяет базовые принципы безопасности пользовательских данных.
Форматирование поля ввода не изменяет факт того, что данные поступают из недоверенного источника. Любое значение, введённое пользователем, должно рассматриваться как потенциально вредоносное.
Типовые угрозы при работе с форматированным вводом:
onerror,
onclick).Особенность Cleave.js заключается в том, что библиотека изменяет представление значения в поле, но не выполняет его очистку с точки зрения безопасности. Это формирует ложное ощущение защищённости.
Cleave.js работает на уровне отображения и синхронизации значения input. Основной поток данных остаётся неизменным:
Критический момент: форматирование не экранирует HTML-сущности и не удаляет опасные конструкции.
Пример опасного значения:
"><img src=x oner ror=alert(1)>
Если такое значение впоследствии используется без обработки, Cleave.js не препятствует его сохранению в DOM или отправке на сервер.
Основной источник XSS в связке с форматированными полями — некорректная вставка данных в DOM.
output.innerHTML = input.value;
Даже при использовании Cleave.js значение остаётся пользовательским вводом. При наличии HTML-конструкций происходит интерпретация браузером.
Безопасный вариант:
output.textContent = input.value;
textContent гарантирует трактовку значения как строки, исключая интерпретацию HTML.
Архитектурно важно разделять:
Cleave.js относится только к первому уровню. Попытка перенести в него ответственность за безопасность приводит к системным уязвимостям.
Перед сохранением или передачей данных на сервер требуется явная очистка:
Пример базовой санитизации:
function sanitize(input) {
return input
.replace(/&/g, "&")
.replace(/</g, "<")
.replace(/>/g, ">")
.replace(/"/g, """)
.replace(/'/g, "'");
}
Важно: Cleave.js не выполняет подобную обработку автоматически.
Cleave.js предоставляет доступ к «сырому» значению через API (например, получение unformatted value). Именно это значение чаще всего используется для отправки на сервер.
Типичная ошибка заключается в смешивании:
Неправильная обработка приводит к тому, что вредоносная строка сохраняется в backend без очистки.
Маски ввода (например, телефонные номера или даты) не являются механизмом защиты.
Пример конфигурации:
new Cleave(input, {
phone: true,
phoneRegionCode: 'KZ'
});
Такая маска ограничивает структуру ввода, но не гарантирует отсутствие опасных символов в обходных сценариях:
При выводе форматированных данных требуется строгая модель рендеринга:
Пример безопасного обновления UI:
function renderValue(el, value) {
el.textContent = value;
}
Даже если Cleave.js формирует визуально сложное представление
(например, 1 234 567), это значение не должно попадать в
HTML через опасные механизмы.
Опасность возникает не только при innerHTML, но и при формировании атрибутов:
element.setAttribute("data-value", input.value);
Если значение не экранируется, возможно внедрение управляющих последовательностей в контексте других частей DOM.
Особенно критичны сценарии:
Cleave.js поддерживает синхронизацию отображаемого и чистого значения. Однако смешивание этих данных в одном контексте приводит к логическим уязвимостям.
Неправильный подход:
const value = input.value;
send(value);
Корректный подход требует явного разделения:
Фронтенд-обработка с Cleave.js не заменяет серверную валидацию.
Сервер должен:
Даже при корректной работе Cleave.js данные могут быть модифицированы до отправки.
Дополнительным уровнем защиты выступает Content Security Policy (CSP):
CSP снижает риск эксплуатации XSS даже при наличии ошибок в обработке ввода.
При интеграции Cleave.js в систему обработки ввода формируется трёхуровневая модель:
Разделение этих уровней исключает перенос ответственности за безопасность на библиотеку форматирования, которая не предназначена для выполнения защитных функций.