Даже если вы ограничили возможность загрузки рабочих, встроенные теги сценариев можно использовать для выполнения XSS-атак .
CSP предотвращает XSS , блокируя все встроенные сценарии. С директивой 'unsafe-inline'
эффективность CSP значительно снижается, поэтому лучше использовать другие методы.
Способ 1: отдельный файл
Вы можете поместить сценарии в другой файл, например loadWorker.js, и включить его с помощью обычного тега сценария:
loadWorker.js:
if (navigator.serviceWorker) {
navigator.serviceWorker.register('/sw.js')
.then(function (registration) {
console.log('Success!', registration.scope);
})
.catch(function (error) {
console.error('Failure!', error);
});
}
Ваш HTML-файл:
<script src="./loadWorker.js"></script>
Способ 2. Использование хеша
CSP разрешает встроенный сценарий, если вы явно разрешаете определенные сценарии , используя хэш .
Хеш для следующих js
if (navigator.serviceWorker) {
navigator.serviceWorker.register('/sw.js')
.then( function (registration) {
console.log('Success!', registration.scope);
})
.catch( function (error) {
console.error('Failure!', error);
}); }
- это 'sha256-vTdjucjBZWvbihWowJ2vrpjYlv4kalHHBIgd7vBr124='
.
Добавьте его в заголовок CSP следующим образом: Content-Security-Policy: script-src 'sha256-vTdjucjBZWvbihWowJ2vrpjYlv4kalHHBIgd7vBr124='
.
Примечание: любые изменения в коде, включая пробелы, изменят хеш. Вам нужно будет пересчитать хеш и заменить заголовок.
Этот метод является громоздким и не рекомендуется