Политика безопасности контента блокирует угловые стили
Я хочу опубликовать веб-приложение со строгой политикой безопасности контента. Последняя оставшаяся проблема:
style-src 'self';
Я получаю сообщение об ошибке в консоли браузера о том, что загрузка ресурса заблокирована на основании директивы style-src в CSP. Ошибка ссылается на код в файле main..js, созданном из
ng build --prod
.
Если я добавлю
'unsafe-inline'
к
style-src
в CSP, все работает нормально, но я не хочу этого делать.
Могу ли я что-нибудь сделать в своем коде или варианте сборки, чтобы веб-приложение работало с более строгим CSP?
Я использовал Angular 11, только что обновился до 12 и получил ту же ошибку.
Спасибо!
3 ответа
Варианты разрешения:
1. Используйте хеши SHA-256.
Если таких нарушений относительно мало, можно добавить их хеши. Например, если вы видите это в своем журнале:
Refused to apply inline style because it violates the following Content Security Policy directive: "style-src 'self' 'report-sample'". Either the 'unsafe-inline' keyword, a hash ('sha256-YpcdPia2p132TdnpnY8zwrWWSqByEKGZBY5iqsLBkSg='), or a nonce ('nonce-...') is required to enable inline execution. Note that hashes do not apply to event handlers, style attributes and javascript: navigations unless the 'unsafe-hashes' keyword is present.
Добавлять
'sha256-YpcdPia2p132TdnpnY8zwrWWSqByEKGZBY5iqsLBkSg='
Вам также может понадобиться
'unsafe-hashes'
- в зависимости от контекста. Примечание: этот подход нелегко поддерживать. Небольшое изменение стиля заставит вас воссоздать хеш. Это полезно только тогда, когда у вас есть несколько таких встроенных скриптов.
2. Одноразовые номера
Вы можете использовать одноразовые номера для «благословения» встроенных стилей и их утверждения. Однако даже эксперты Google, которые выступают за одноразовые номера CSP , обычно не развертывают их - только на. Примечание. Этот подход сложно внедрить. Для каждой загрузки страницы необходимо создавать уникальный одноразовый номер.
3. Используйте
'unsafe-inline'
- подходит для (не подходит для
script-src
)
На самом деле, даже установка CSP с
style-src 'unsafe-inline' 'self' someurl.com;
намного безопаснее 99,9% сайтов. Больше, чем accounts.google.com , который не ограничивает
style-src
вообще. У Github есть фантастически качественный CSP с
style-src: 'unsafe-inline'
Удачи!
Если я добавлю
'unsafe-inline'
кstyle-src
в CSP, все работает нормально, но я не хочу этого делать.
Похоже, сейчас это невозможно. Согласно потоку поддержки Angular на Github, для приложений Angular требуется разрешение 'unsafe-inline' в style-src (см. «Предлагаемые шаги» 1. «Мы должны четко заявить, что разрешение 'unsafe-inline' в style- src требуется для приложений Angular. ").
Обновление для Angular 16: теперь вы можете предоставить токен CSP_NONCE, и он будет применять этот nonce к любому CSS, добавленному Angular. Одноразовый номер просто должен совпадать с номером, указанным в вашей Политике безопасности контента.
bootstrapApplication(AppComponent, {
providers: [{
provide: CSP_NONCE,
useValue: globalThis.myRandomNonceValue
}]
});