Navigo — это легковесная библиотека для клиентского маршрутизирования в приложениях на JavaScript. При работе с маршрутизатором важно учитывать безопасность, чтобы предотвратить уязвимости, связанные с неконтролируемым доступом к страницам, передачей параметров и обработкой пользовательского ввода.
Каждый маршрут, особенно если он содержит параметры из URL, требует
строгой валидации. Navigo позволяет определять параметры через
:param в пути, но их значение приходит напрямую из URL и
может содержать опасные символы.
Пример:
const router = new Navigo('/');
router.on('/user/:id', ({ data }) => {
const userId = parseInt(data.id, 10);
if (isNaN(userId) || userId <= 0) {
console.error('Недопустимый ID пользователя');
return;
}
loadUserProfile(userId);
});
Ключевые моменты:
parseInt,
parseFloat) для числовых параметров.Для защиты приватных разделов приложения важно внедрять механизмы контроля доступа:
function authGuard(callback) {
return function(params) {
if (!userIsLoggedIn()) {
router.navigate('/login');
return;
}
callback(params);
};
}
router.on('/dashboard', authGuard(() => {
renderDashboard();
}));
Рекомендации:
Данные из URL могут содержать вредоносный код. Любое использование этих данных в DOM должно быть безопасным:
const safeText = (text) => text.replace(/</g, '<').replace(/>/g, '>');
router.on('/search/:query', ({ data }) => {
const query = safeText(data.query);
document.getElementById('results').textContent = `Результаты для: ${query}`;
});
Советы по безопасности:
innerHTML.Navigo поддерживает wildcard-маршруты (*). Использование
слишком общих паттернов может привести к случайному раскрытию
маршрутов:
router.on('/admin/*', ({ url }) => {
if (!userIsAdmin()) {
router.navigate('/forbidden');
return;
}
renderAdminPage(url);
});
Рекомендации:
Query-параметры не обрабатываются автоматически Navigo, поэтому их нужно парсить и фильтровать самостоятельно:
function getQueryParams() {
const params = {};
window.location.search.replace(/\??(?:([^=]+)=([^&]*)&?)/g, (_, key, value) => {
params[key] = decodeURIComponent(value);
});
return params;
}
router.on('/products', () => {
const params = getQueryParams();
const page = parseInt(params.page, 10) || 1;
loadProductsPage(page);
});
Практика безопасности:
Неправильные маршруты или исключения в обработчиках должны корректно обрабатываться, чтобы приложение не раскрывалось злоумышленникам:
router.notFound(() => {
render404Page();
});
router.on('/profile/:id', ({ data }) => {
try {
loadProfile(data.id);
} catch (e) {
console.error(e);
renderErrorPage();
}
});
Рекомендации:
try/catch в обработчиках маршрутов.Navigo позволяет хранить состояние через
router.navigate() с объектом state. Необходимо
избегать передачи конфиденциальной информации:
router.navigate('/checkout', { state: { total: 500 } }); // безопаснее передавать ID корзины, а не суммы
Лучшие практики:
Маршрутизация не защищает данные самостоятельно. Важно комбинировать Navigo с общими мерами безопасности:
HttpOnly и Secure.Эти методы обеспечивают безопасную работу Navigo в клиентских приложениях и минимизируют риски, связанные с неконтролируемыми URL-параметрами, пользовательскими данными и правами доступа.