Workbox предоставляет ряд инструментов для управления кэшем в сервис-воркере, однако неправильная конфигурация кэша может стать вектором атак. Основные угрозы включают подмену ресурсов, атаки повторного воспроизведения (replay attacks) и кэш-перенаправления.
Workbox позволяет использовать стратегии кэширования, такие как
CacheFirst и NetworkFirst. Для защиты важно не
только выбирать стратегию, но и контролировать версию ресурсов:
workbox.precaching.precacheAndRoute([
{ url: '/index.html', revision: '12345' },
{ url: '/main.js', revision: '67890' },
]);
revision — уникальный хэш версии ресурса,
обеспечивающий, что устаревшие файлы не будут подставлены из кэша.revision, иначе
пользователи могут получать старые версии скриптов, что создаёт
уязвимость для атак с подменой кода.Ресурсы, получаемые через сторонние источники, требуют строгой проверки. Workbox позволяет задать фильтры для кэширования:
workbox.routing.registerRoute(
({url}) => url.origin === 'https://trusted.cdn.com',
new workbox.strategies.CacheFirst({
cacheName: 'trusted-resources',
plugins: [
new workbox.expiration.ExpirationPlugin({
maxEntries: 50,
maxAgeSeconds: 7 * 24 * 60 * 60, // 1 неделя
}),
new workbox.cacheableResponse.CacheableResponsePlugin({
statuses: [0, 200],
}),
],
})
);
CacheableResponsePlugin ограничивает кэш только
успешными ответами (200) и ответами без статуса (0), что предотвращает
сохранение ошибок или перенаправлений.ExpirationPlugin предотвращает бесконтрольный рост кэша
и снижает риск хранения устаревших уязвимых файлов.Стратегия StaleWhileRevalidate позволяет отдавать
пользователю кэшированную версию, одновременно проверяя обновления на
сервере. Для безопасности важно настроить фильтрацию обновлений:
workbox.routing.registerRoute(
({request}) => request.destination === 'script',
new workbox.strategies.StaleWhileRevalidate({
cacheName: 'js-cache',
plugins: [
new workbox.cacheableResponse.CacheableResponsePlugin({
statuses: [200],
}),
],
})
);
Атаки повторного воспроизведения возможны, если устаревший кэш подставляется в критические запросы, например, формы или JSON-API. В Workbox для защиты используются фильтры по HTTP-методу и заголовкам:
workbox.routing.registerRoute(
({request}) => request.url.endsWith('/api/data') && request.method === 'GET',
new workbox.strategies.NetworkFirst({
cacheName: 'api-cache',
plugins: [
new workbox.expiration.ExpirationPlugin({
maxAgeSeconds: 60, // кэшировать только 1 минуту
}),
],
})
);
NetworkFirst гарантирует, что всегда
будет проверка актуальности данных.Проблема возникает, когда кэш перезаписывает URL с вредоносным редиректом. Workbox позволяет ограничить кэширование редиректов:
new workbox.cacheableResponse.CacheableResponsePlugin({
statuses: [0, 200],
})
revision: любые
изменения файлов должны сопровождаться изменением версии.Эти методы обеспечивают многоуровневую защиту кэша и предотвращают распространённые виды атак на сервис-воркеры при работе с Workbox.