Политика Безопасности Контента. Продолжение
Начало
Встроенный код
Если существует директива CSP
default-src или style-src, то встроенные стили перестают работать. Аналогично, при наличии default-src или script-src встроенный код JavaScript больше выполняться не будет. Это позволяет защититься от внедрения кода вида <script>/* вредоносный код */</script>. При этом
<script src="script.js"></script> будет работать. Обычно лучше избегать встроенного кода. Вынесите код JavaScript и CSS во внешние файлы.
Однако, если нужно активировать встроенный контент, есть несколько вариантов:
1. Атрибут nonce (одноразовый номер)
Случайный одноразовый токен (например, GUID), который добавляется в HTTP заголовок:
default-src 'self'; style-src 'self' 'nonce-123456'; script-src 'self' 'nonce-123456'и во все элементы
<script> и <style>, где используются встроенный код: <script nonce="123456'">…</script>2. Хэш контента элемента
Нужно вычислить хеш SHA256, SHA384 или SHA512 контента элемента
<script> или <style>, включая разрывы строк и другие пробельные символы, и добавить в HTTP-заголовок значение 'sha<алгоритм>-<хэш>':default-src 'self'; script-src 'self' 'sha256-nzw…='Теперь эта политика явно разрешает встроенный код JavaScript, соответствующий хэшу.
Использование хэша не распространяется на:
- атрибуты обработчиков событий (например,
onclick);- ссылки JavaScript: (
<a href="JavaScript:…">);- атрибуты стилей (
style="…").Для активации этих функций, к значениям политики
script-src или style-src надо добавить константу 'unsafe-hashes' (в дополнение к хэшам кода в этих атрибутах).Также перестанет работать динамическое выполнение кода (eval(), setInterval(), setTimeout() со строковыми аргументами и т.п.). Чтобы включить это, нужно добавить
'unsafe-eval'.3. Значение 'unsafe-inline'.
Разрешает исполнение встроенного кода (практически сводя на нет преимущества CSP).
Проверка кода JavaScript с помощью Subresource Integrity (SRI)
Если вы загружаете файл JavaScript со стороннего сервера, то можно проверить, что он не был подделан. Присвойте атрибуту integrity тега <script> хэш содержимого файла JavaScript:
<script src="https://code.jquery.com/jquery-3.6.0.min.js"Если содержимое файла JavaScript не совпадает с хэшем, браузер откажется выполнить код.
integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4="></script>
Окончание следует…
Источник: Кристиан Венц “Безопасность ASP.NET Core”. М.: ДМК Пресс, 2023. Глава 2.