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
.