Content Security Policy (CSP) — механизм безопасности браузера, ограничивающий источники загрузки ресурсов и выполнение кода на странице. В проектах с использованием Headroom.js CSP играет важную роль, поскольку библиотека взаимодействует с DOM, добавляет/удаляет CSS-классы и может использовать встроенные стили или скрипты в зависимости от архитектуры приложения.
Headroom.js сам по себе не внедряет небезопасный код, однако неправильная настройка CSP может привести к блокировке его работы или сопутствующих элементов интерфейса.
CSP задаётся через HTTP-заголовок:
Content-Security-Policy: <директивы>
или через <meta>-тег:
<meta http-equiv="Content-Security-Policy" content="default-src 'self'">
Ключевые директивы:
Headroom.js обычно подключается через:
<script src="headroom.min.js"></script>
или через CDN:
<script src="https://cdn.jsdelivr.net/npm/headroom.js@0.12.0/dist/headroom.min.js"></script>
Чтобы разрешить загрузку Headroom.js:
script-src 'self' https://cdn.jsdelivr.net
Если используется локальная версия:
script-src 'self'
Headroom.js часто инициализируется через встроенный скрипт:
<script>
var header = document.querySelector("header");
var headroom = new Headroom(header);
headroom.init();
</script>
По умолчанию CSP блокирует inline-скрипты. Для их разрешения есть несколько вариантов:
'unsafe-inline' (не рекомендуется)script-src 'self' 'unsafe-inline'
Недостаток — снижение безопасности.
Более безопасный способ:
HTML:
<script nonce="abc123">
var header = document.querySelector("header");
var headroom = new Headroom(header);
headroom.init();
</script>
CSP:
script-src 'self' 'nonce-abc123'
Nonce должен генерироваться динамически на сервере.
Рекомендуемый подход:
<script src="app.js"></script>
script-src 'self'
Headroom.js управляет классами:
headroomheadroom--pinnedheadroom--unpinnedheadroom--topheadroom--not-topПример CSS:
.headroom {
transition: transform 0.3s ease-in-out;
}
.headroom--unpinned {
transform: translateY(-100%);
}
.headroom--pinned {
transform: translateY(0);
}
Если стили находятся в отдельном файле:
style-src 'self'
Если используются inline-стили:
<style>
...
</style>
необходимо:
style-src 'self' 'unsafe-inline'
или:
style-src 'self' 'nonce-xyz'
Headroom.js изменяет DOM, добавляя и удаляя классы. Это не нарушает CSP, поскольку:
Таким образом, базовая работа библиотеки не требует дополнительных разрешений.
Headroom.js может использоваться вместе с:
Content-Security-Policy:
default-src 'self';
script-src 'self';
style-src 'self';
img-src 'self' dat a:;
font-src 'self';
connect-src 'self';
Если используется CDN:
script-src 'self' https://cdn.jsdelivr.net;
style-src 'self' https://cdn.jsdelivr.net;
Альтернатива nonce — использование hash:
script-src 'self' 'sha256-<hash>'
Преимущество — статичность Недостаток — сложность поддержки при изменении кода
При использовании сборщиков:
script-src 'self'
Важно:
eval() и new Function()Для отладки используется:
Content-Security-Policy-Report-Only
Пример:
Content-Security-Policy-Report-Only:
default-src 'self';
report-uri /csp-report
Браузер не блокирует ресурсы, а только сообщает о нарушениях.
Ошибка:
Refused to load script from ...
Решение:
script-src 'self' https://cdn.jsdelivr.net
Ошибка:
Refused to execute inline script
Решение:
Причина:
Решение:
style-src 'self'
или добавить CDN
Некоторые сборки могут использовать:
eval()
CSP блокирует это:
script-src 'self'
Чтобы разрешить:
script-src 'self' 'unsafe-eval'
Но это снижает безопасность.
Рекомендуемые принципы:
Пример:
Content-Security-Policy:
default-src 'self';
script-src 'self';
style-src 'self';
img-src 'self' dat a:;
font-src 'self';
connect-src 'self';
object-src 'none';
base-uri 'self';
frame-ancestors 'none';
Headroom.js управляет видимостью шапки страницы при прокрутке. При неправильной CSP:
Это приводит к:
Инструменты:
Проверка включает:
CSP поддерживается:
Headroom.js не требует специальных разрешений CSP, кроме стандартных правил загрузки скриптов и стилей.
HTML:
<link rel="stylesheet" href="styles.css">
<script src="bundle.js"></script>
CSP:
Content-Security-Policy:
default-src 'self';
script-src 'self';
style-src 'self';
JavaScript (bundle.js):
import Headroom from "headroom.js";
const header = document.querySelector("header");
const headroom = new Headroom(header);
headroom.init();
Такой подход полностью совместим со строгой политикой безопасности.