При использовании Flatpickr ключевой источник риска — не сам календарь, а путь данных от пользователя к приложению. Компонент формирует строковое представление даты, но при включённом ручном вводе или кастомных форматах эта строка становится внешним вводом, который может попасть в DOM, бизнес-логику или запросы к серверу без дополнительной обработки.
Основные угрозы:
Flatpickr сам по себе не является валидатором безопасности. Он лишь формирует интерфейс выбора даты.
Одной из базовых защитных практик является разделение:
altInput — человекочитаемое отображениеaltFormat — формат для отображения пользователюdateFormat — формат внутреннего значенияПри использовании:
flatpickr("#date", {
altInput: true,
altFormat: "d.m.Y",
dateFormat: "Y-m-d"
});
в DOM появляется два поля:
Ключевой момент: любое последующее использование
должно опираться только на dateFormat, а не на отображаемый
input.
Параметр:
allowInput: true
открывает возможность ввода строки напрямую, минуя календарь. Именно здесь чаще всего возникает рассинхронизация состояния.
Типичные проблемы:
32.13.2025)2025-..-01)Flatpickr позволяет переопределить парсинг:
parseDate: (str, format) => {
return new Date(str);
}
Но такой подход опасен без явной нормализации.
Корректная стратегия:
Пример более строгой логики:
parseDate: (str) => {
const match = str.match(/^(\d{4})-(\d{2})-(\d{2})$/);
if (!match) return null;
const [_, y, m, d] = match;
const date = new Date(`${y}-${m}-${d}T00:00:00`);
return isNaN(date) ? null : date;
}
События:
onChangeonCloseonValueUpdateиспользуются как точки контроля целостности данных.
Пример концепции:
onChange — первичная проверка форматаonClose — финальная валидация состоянияonValueUpdate — синхронизация с моделью данныхВажно: события не заменяют валидацию, а лишь сигнализируют о необходимости проверки.
Параметры:
minDatemaxDatedisableиспользуются для создания белого списка допустимых значений.
Пример:
flatpickr("#date", {
minDate: "2025-01-01",
maxDate: "2026-01-01"
});
Это не только UX-ограничение, но и механизм первичной фильтрации ввода.
Даже при наличии календаря пользователь может вставить значение напрямую.
Основные сценарии риска:
Стратегия защиты:
input событияFlatpickr не вставляет HTML в DOM, но приложение может сделать это позже:
element.innerHTML = fp.input.value;
Если значение не экранируется, возникает риск XSS.
Безопасные альтернативы:
textContent вместо innerHTMLКлиентская санитизация не является гарантией безопасности.
Сервер должен:
Пример допустимого формата:
YYYY-MM-DDYYYY-MM-DDTHH:mm:ssZ (при необходимости времени)При использовании локалей формат ввода может меняться:
dd.mm.yyyymm/dd/yyyyЭто увеличивает риск:
Решение — всегда фиксировать dateFormat независимо от
локали отображения.
Flatpickr следует рассматривать как:
Но не как:
Любая бизнес-логика должна опираться на:
Пример уязвимого сценария:
document.querySelector("#date").value = "<script>alert(1)</script>";
Flatpickr не интерпретирует это как HTML, но дальнейшая логика приложения может.
Механизмы защиты:
setDate вместо прямого присваиванияНадёжная модель включает несколько слоёв:
UI-слой Flatpickr
Клиентская валидация
Приложение
Сервер
Любое отклонение должно приводить к предсказуемому поведению:
Недопустимо: