Content Security Policy (CSP) - это стандарт безопасности, который помогает предотвращать XSS-атаки, ограничивая источники, из которых могут загружаться скрипты, стили и другие ресурсы.
default-src - политика по умолчанию для всех типов
script-src - источники выполнения JavaScript
style-src - источники CSS
img-src - источники изображений
connect-src - источники для AJAX, WebSockets
font-src - источники шрифтов
frame-src - источники для фреймов
media-src - источники медиа (video, audio)
Inline-стили и скрипты: Angular по умолчанию использует:
eval()
для JIT-компиляцииШаблоны: Динамическая компиляция шаблонов может нарушать CSP.
В angular.json
добавьте:
"architect": {
"build": {
"options": {
"optimization": true,
"aot": true,
"csp": true
}
}
}
Обязательно включите AOT для production:
ng build --prod --aot
Добавьте в index.html
:
<meta http-equiv="Content-Security-Policy"
content="default-src 'self';
script-src 'self' 'unsafe-inline' https://apis.google.com;
style-src 'self' 'unsafe-inline';
img-src 'self' data:;
font-src 'self';
connect-src 'self' https://api.example.com;">
Пример для Nginx:
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-eval'; style-src 'self' 'unsafe-inline';";
Для компонентов с динамическими стилями:
@Component({
template: `<div [style.backgroundColor]="color"></div>`,
styles: [`
div {
/* Статический стиль */
}
`]
})
Ошибка eval():
platformBrowser().bootstrapModuleFactory(AppModuleNgFactory)
Inline-стили:
ViewEncapsulation.None
Внешние ресурсы:
<meta http-equiv="Content-Security-Policy"
content="default-src 'none';
script-src 'self' 'sha256-abc123...';
style-src 'self' 'unsafe-inline';
img-src 'self' data:;
font-src 'self';
connect-src 'self' https://api.example.com;
form-action 'self';
frame-ancestors 'none';
base-uri 'self';">
Content-Security-Policy-Report-Only: default-src 'self'; report-uri /csp-report
Для работы Angular с CSP необходимо использовать AOT-компиляцию, избегать динамической компиляции и явно указывать все источники ресурсов. Настройка требует баланса между безопасностью и функциональностью фреймворка.