Content Security Policy (CSP) — ключевой инструмент защиты веб‑приложений от XSS‑атак, но его интеграция с отчётными системами нередко сопряжена со сложностями. В новых версиях FastReport .NET WEB архитектура клиентской части существенно переработана — это упрощает соблюдение строгой CSP без потери функциональности отчётов. В статье разберём, как грамотно настроить CSP для отчётов FastReport и учесть типичные риски.
Content Security Policy (CSP) — это механизм или даже стандарт безопасности веб-приложений, позволяющий контролировать, какие ресурсы (скрипты, стили, шрифты, изображения, подключения и т.д.) могут быть загружены и выполнены на странице. CSP реализуется через HTTP-заголовок Content-Security-Policy или HTML-мета-тег.
Основная цель CSP — предотвращение атак Cross-Site Scripting (XSS) и внедрения вредоносного кода. Политика запрещает выполнение неподписанных или неразрешенных скриптов, даже если злоумышленнику удалось внедрить тег <script> в страницу.
Дополнительно CSP может:
| Директива | Назначение | Пример значения |
default-src |
Источник по умолчанию для всех типов ресурсов | 'self' |
script-src |
Разрешённые источники JavaScript | 'self' 'nonce-...' |
style-src |
Разрешённые источники CSS | 'self' 'unsafe-inline' |
img-src |
Разрешённые источники изображений | data: https: |
connect-src |
Разрешённые адреса для fetch, XHR, WebSocket | 'self' http: ws: |
font-src |
Разрешённые источники шрифтов | https://fonts.gstatic.com |
object-src |
Разрешённые источники для <object>, <embed> | 'none' |
base-uri |
Ограничение URL для тега <base> | 'self' |
frame-ancestors |
Разрешённые родители для встраивания в iframe | 'none' |
'self' — только собственный домен (включая схему и порт).'unsafe-inline' — разрешить inline-скрипты и стили (требуется осторожность).'unsafe-eval' — разрешить eval() и подобные конструкции.'nonce-{value}' — одноразовый криптографический токен.'sha256-{hash}' — хеш содержимого inline-скрипта/стиля.data: — разрешить data: URL (актуально для изображений).https: — разрешить любые HTTPS-источники.
app.Use(async (context, next) => { context.Response.Headers.ContentSecurityPolicy = "script-src 'self' 'unsafe-inline' 'unsafe-eval';style-src 'self' 'unsafe-inline'"; await next(); });
Также это можно сделать в html разметке:
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'; style-src 'self'; img-src data: https:; object-src 'none';">
В последних версиях FastReport .NET WEB архитектура клиентской части была значительно переработана:
unsafe-inline для скриптов.Важное замечание об inline-стилях отчётов: стили, генерируемые для содержимого страниц отчёта (таблицы, текст, рамки), остаются inline. Для корректного отображения отчёта необходимо разрешить unsafe-inline в директиве style-src.
Вынос JS и CSS в статические файлы дал не только совместимость с CSP, но и возможность переопределять стили WebReport без изменения исходных файлов (например, через дополнительный CSS с более высоким приоритетом). Ещё расширилось поведение, теперь можно подключать свои скрипты, переопределять методы, добавлять обработчики. И конечно же улучшилось кеширование — браузер загружает статику один раз.
Несмотря на надежность CSP, существуют сценарии обхода. Большинство из них связаны не с недостатками стандарта, а с ошибками внедрения.
Internet Explorer поддерживает CSP частично — может игнорировать ключевые директивы. Современные браузеры (Chrome, Opera, Safari, Firefox) работают корректно.
Решение: не полагайтесь только на CSP в устаревших браузерах — используйте дополнительные защитные механизмы.
При открытии текстового документа или изображения браузер может автоматически создать iframe-обертку. У такой страницы нет настроенного CSP, что позволяет выполнить вредоносный код.
Решение: настройте CSP для всех генерируемых страниц, включая загружаемые ресурсы.
Разработчики часто защищают только рабочие страницы, забывая про ошибки 404, 403, 500. Злоумышленник может внедрить скрипт в фрейм с такой страницей.
Решение: применяйте CSP глобально — через middleware или веб-сервер (Nginx, IIS, Apache).
Некоторые сайты используют облачные хранилища (Яндекс.Диск, Google Drive) как источники контента. Злоумышленник может разместить там вредоносный файл или скрипт.
Решение: не используйте 'unsafe-inline' и https: в script-src, если это не критически необходимо. Вместо этого укажите конкретные домены: script-src 'self' https://trusted-cdn.com;
Таким образом новая версия FastReport .NET WEB позволяет безопасно использовать отчеты в приложениях с жесткой политикой CSP, минимизируя исключения вроде unsafe-inline. При этом разработчик получает:
Внедряйте строгую CSP в своих проектах без ущерба для функциональности отчетов.