Content Security Policy (CSP) — это механизм безопасности, который позволяет ограничивать источники контента, загружаемого на страницу, снижая риск атак типа XSS (Cross-Site Scripting). Для современных JavaScript-фреймворков, включая Mithril.js, корректная настройка CSP критически важна, поскольку динамическая генерация DOM и использование inline-скриптов могут конфликтовать с политикой безопасности.
Разделение источников контента CSP задаётся с
помощью HTTP-заголовка Content-Security-Policy или
мета-тега <meta>. Он определяет, какие источники
разрешены для загрузки различных типов ресурсов:
script-src — источники JavaScript.style-src — источники CSS.img-src — источники изображений.connect-src — источники для AJAX-запросов.font-src, media-src,
frame-src — для шрифтов, мультимедиа и встроенных
фреймов.Запрет inline-скриптов и eval Строгая CSP
запрещает использование inline-скриптов
(<script>...</script>) и функций вроде
eval(). Mithril активно использует JavaScript для генерации
виртуального DOM, но при этом обычно не требует inline-скриптов, если
код разделён на модули.
Использование nonce и hash Если необходимо
включить inline-скрипт, CSP позволяет использовать атрибут
nonce или хэш содержимого скрипта. Это даёт возможность
выполнять только проверенные скрипты и блокировать все
остальные.
Mithril.js строится вокруг функций m() и
m.mount(), которые создают виртуальный DOM и монтируют
компоненты на страницу. CSP может конфликтовать с определёнными
подходами, например:
<button oncl ick="doSomething()"> будут блокированы
строгой CSP. Вместо этого события должны назначаться через
Jav * aScript:m('button', { onclick: () => console.log('Clicked') }, 'Нажми меня');
eval()
или new Function() запрещено в безопасной политике. Mithril
не требует подобных конструкций, что делает его совместимым с CSP.Content-Security-Policy:
default-src 'self';
script-src 'self';
style-src 'self' 'unsafe-inline';
img-src 'self' dat a:;
connect-src 'self' https://api.example.com;
font-src 'self';
'self' ограничивает загрузку ресурсов с собственного
домена.'unsafe-inline' в style-src позволяет
использовать inline-стили, что иногда требуется для Mithril-компонентов
с динамическими стилями.connect-src указывает, какие адреса разрешены для
fetch/AJAX-запросов.Mithril не генерирует <script> теги динамически, а
работает через виртуальный DOM и методы JavaScript. Это означает:
unsafe-inline для
script-src.m.request нужно ограничивать
разрешёнными доменами в CSP (connect-src).default-src 'self' и явным указанием
доверенных ресурсов.nonce или хэш.CSP violation в консоли).Mithril активно обновляет DOM без перезагрузки страницы. CSP не блокирует создание элементов через JavaScript, если:
eval или
new Function.innerHTML с недоверенным
содержимым.Для безопасного рендеринга стороннего HTML следует использовать специализированные библиотеки-санитайзеры или встроенные методы Mithril:
m.trust(safeHtmlString)
m.trust позволяет внедрять доверенный HTML, но его
использование должно быть строго ограничено и проверено.
default-src 'self' — базовое ограничение по
умолчанию.script-src 'self' — разрешение только локальных
скриптов.style-src 'self' 'unsafe-inline' — для динамических
стилей.img-src 'self' dat a: — изображения с сервера и
встроенные данные.connect-src 'self' + список API-доменов — для
безопасных сетевых запросов.font-src 'self' — загрузка шрифтов только с
собственного домена.Эта конфигурация обеспечивает высокую безопасность и совместимость с архитектурой Mithril, минимизируя риски XSS и других атак.