nonceАтрибут позволяет «белый список» некоторые встроенные scriptи styleэлементов, избегая использования НСП unsafe-inlineдирективы (который позволил бы все инлайн script/ style), так что вы по- прежнему сохраняют ключевую CSP особенность запрещая рядный script/ styleв целом.
Таким образом, nonceатрибут - это способ сообщить браузерам, что встроенное содержимое определенного скрипта или элемента стиля не было введено в документ какой-либо (злонамеренной) третьей стороной, а вместо этого было намеренно помещено в документ тем, кто контролирует сервер, на котором обслуживается документ. из.
https://developers.google.com/web/fundamentals/security/csp/#if_you_absolutely_must_use_it дает хороший пример того, как использовать nonceатрибут, который состоит из следующих шагов:
Для каждого запроса, получаемого вашим веб-сервером для конкретного документа, пусть ваш бэкэнд генерирует случайную строку в кодировке base64 из не менее 128 бит данных из криптографически безопасного генератора случайных чисел; например, EDNnf03nceIOfn39fn3e9h3sdfa. Это твоя глупость.
Возьмите одноразовый номер, сгенерированный на шаге 1, и для любого встроенного script/, который styleвы хотите внести в «белый список», заставьте свой внутренний код вставлять nonceатрибут в документ перед его отправкой по сети, используя этот одноразовый номер в качестве значения:
<script nonce="EDNnf03nceIOfn39fn3e9h3sdfa">…</script>
Возьмите одноразовый номер, сгенерированный на шаге 1, добавьте nonce-к нему и заставьте свой бэкэнд сгенерировать заголовок CSP с этим среди значений исходного списка для script-srcили style-src:
Content-Security-Policy: script-src 'nonce-EDNnf03nceIOfn39fn3e9h3sdfa'
Таким образом, механизм использования одноразового номера является альтернативой тому, что вместо того, чтобы ваш бэкэнд генерировал хэш содержимого встроенного scriptили styleвы хотите разрешить, а затем указывал этот хеш в соответствующем списке источников в вашем заголовке CSP.
Обратите внимание: поскольку браузеры не (не могут) проверять, что значение nonce отправлено изменения между запросами страницы, возможно - хотя и совершенно нецелесообразно - пропустить 1 выше и не заставить серверную часть делать что-либо динамически для nonce, и в этом случае вы можно просто поместить nonceатрибут со статическим значением в источник HTML вашего документа и отправить статический заголовок CSP с тем же значением nonce.
Но причина, по которой вы не хотите использовать статический одноразовый номер таким образом, заключается в том, что это в значительной степени нарушит всю цель использования одноразового номера с самого начала - потому что, если бы вы использовали такой статический одноразовый номер, в этот момент вы могли бы просто использовать unsafe-inline.