Для работы с библиотекой Smooth Scroll достаточно подключить её через npm или CDN. Стандартное подключение через CDN выглядит так:
<script src="https://cdn.jsdelivr.net/npm/smooth-scroll@16/dist/smooth-scroll.polyfills.min.js"></script>
После подключения создается экземпляр Smooth Scroll:
const scroll = new SmoothScroll('a[href*="#"]', {
speed: 500,
speedAsDuration: true,
offset: 0,
easing: 'easeInOutCubic'
});
Ключевые параметры:
speed – скорость прокрутки в миллисекундах.speedAsDuration – если true, скорость
становится фиксированной длительностью анимации.offset – смещение от верхнего края страницы.easing – функция сглаживания движения (easeInOutCubic,
linear и другие).Хотя Smooth Scroll отвечает только за визуальную анимацию прокрутки, использование ссылок и динамических данных может быть уязвимо для инъекций, если не соблюдать правила проверки входных данных. Основные моменты:
Фильтрация URL и якорей. Любые значения
href для ссылок с # должны проверяться перед
использованием. Например, если якорь приходит из пользовательского
ввода:
function sanitizeAnchor(anchor) {
return anchor.replace(/[^a-zA-Z0-9-_]/g, '');
}
const safeAnchor = sanitizeAnchor(userInput);
scroll.animateScroll(document.querySelector(`#${safeAnchor}`));
Это предотвращает вставку вредоносного кода в селектор.
Использование querySelector безопасным
образом. querySelector принимает строку
CSS-селектора. Любая неподготовленная строка может привести к XSS через
динамический код. Всегда экранируйте специальные символы, если значение
приходит извне.
Отказ от innerHTML для динамических
ссылок. Если ссылки создаются программно, необходимо
использовать textContent или
setAttribute('href', ...), чтобы исключить внедрение
HTML:
const link = document.createElement('a');
link.textContent = 'Перейти';
link.setAttribute('href', `#${sanitizeAnchor(userAnchor)}`);Проверка схемы URL. Smooth Scroll работает
только с якорями на текущей странице. Не следует допускать значения
вроде jav * ascript:alert(1) или внешние ссылки:
if (!/^#[a-zA-Z0-9-_]+$/.test(anchor)) return;Smooth Scroll позволяет использовать колбэки before и
after:
const scroll = new SmoothScroll('a[href*="#"]', {
before: (anchor, toggle) => {
if (!/^#[a-zA-Z0-9-_]+$/.test(anchor.getAttribute('href'))) {
return false; // блокируем прокрутку
}
}
});
Это позволяет проверять каждый якорь перед анимацией и предотвращать попытки внедрения кода.
Если элементы с якорями добавляются на страницу после загрузки, необходимо безопасно инициировать прокрутку:
document.body.addEventListener('click', function(e) {
const target = e.target.closest('a[href^="#"]');
if (target) {
const anchorId = sanitizeAnchor(target.getAttribute('href').substring(1));
const anchorEl = document.getElementById(anchorId);
if (anchorEl) {
scroll.animateScroll(anchorEl);
e.preventDefault();
}
}
});
Здесь:
closest('a[href^="#"]') гарантирует, что событие
обрабатывается только для якорных ссылок.sanitizeAnchor предотвращает инъекции через ID.getElementById безопаснее querySelector
для динамических селекторов.Для крупных проектов полезно вести журнал попыток передачи некорректных якорей:
function logUnsafeAnchor(anchor) {
console.warn(`Попытка небезопасной прокрутки к: ${anchor}`);
}
Можно использовать эту функцию внутри before или при
фильтрации динамических ссылок. Это помогает выявлять потенциальные
атаки и реагировать на них до возникновения XSS.
Любые данные из API или пользовательских форм, которые влияют на прокрутку, должны проходить три этапа проверки:
const safeAnchor = sanitizeAnchor(apiResponse.anchor);
const el = document.getElementById(safeAnchor);
if (el) scroll.animateScroll(el);
Это исключает любые попытки использовать Smooth Scroll для выполнения произвольного кода.
Для усиленной безопасности можно:
Эти меры совместно с правильной фильтрацией данных делают использование Smooth Scroll безопасным, даже если страница обрабатывает динамический и пользовательский контент.