Content Security Policy (CSP) — это механизм безопасности веб-приложений, позволяющий контролировать источники контента, загружаемого браузером. Для фреймворка Stencil CSP играет ключевую роль в защите компонентов и предотвращении атак типа XSS (Cross-Site Scripting).
CSP работает через HTTP-заголовок
Content-Security-Policy или мета-тег
<meta http-equiv="Content-Security-Policy" content="...">.
Политика определяет разрешённые источники для скриптов, стилей,
изображений, шрифтов и других ресурсов.
Пример базовой политики:
Content-Security-Policy: default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline';
default-src 'self' — разрешает загружать ресурсы только
с того же домена.script-src 'self' — скрипты только с текущего
сайта.style-src 'self' 'unsafe-inline' — стили могут быть из
текущего домена и встроенные.Stencil генерирует компоненты как стандартизированные Web Components, которые могут использовать Shadow DOM. CSP накладывает ограничения на inline-скрипты и стили, что важно учитывать при рендеринге компонентов.
type="module"), но некоторые динамически
генерируемые скрипты могут нарушать политику
script-src 'self'.:host и CSS-переменных
могут потребоваться разрешения на inline-стили.Для безопасной работы с CSP рекомендуется:
unsafe-inline.'sha256-...') для конкретных
inline-скриптов или стилей.Stencil не предоставляет встроенного механизма для генерации CSP, но структура проекта позволяет легко интегрировать его через сервер или хостинг.
Пример интеграции через Node.js сервер:
import express from 'express';
import path from 'path';
const app = express();
app.use((req, res, next) => {
res.setHeader("Content-Security-Policy", "default-src 'self'; script-src 'self'; style-src 'self';");
next();
});
app.use(express.static(path.join(__dirname, 'www')));
app.listen(3000, () => {
console.log('Server running on port 3000');
});
Пример для Netlify или других статических хостингов:
[[headers]]
for = "/*"
[headers.values]
Content-Security-Policy = "default-src 'self'; script-src 'self'; style-src 'self';"
import() для ленивой загрузки компонентов,
политика script-src 'self' должна разрешать модульные
скрипты.script-src и
style-src.Для разрешения конкретного inline-скрипта можно использовать хэш SHA-256:
Content-Security-Policy: script-src 'self' 'sha256-xyz...';
Stencil позволяет сгенерировать хэши для встроенных стилей и скриптов при билде, что обеспечивает строгую и безопасную политику.
Content-Security-Policy-Report-Only: default-src 'self'; report-uri /csp-report-endpoint;
Отчёты помогают выявить нарушения и настроить точную политику перед полной блокировкой.
report-only перед полной
активацией.Stencil и CSP совместимы, но требуют внимательной настройки при использовании Shadow DOM, ленивой загрузки компонентов и сторонних ресурсов. Правильная конфигурация CSP значительно повышает безопасность веб-приложений на базе Stencil.