Подтвердить что ты не робот

Какова цель атрибута HTML "nonce" для script и элементов стиля?

W3C говорит, что в HTML5.1 есть новый атрибут nonce для style и script, который может использоваться политикой безопасности содержимого веб-сайта.

Я обдумал это, но, наконец, не понял, что на самом деле этот атрибут делает и какие изменения при его использовании?

4b9b3361

Ответ 1

Атрибут nonce позволяет вам "переименовывать" определенные встроенные элементы script и style, избегая при этом использования директивы CSP unsafe-inline (которая позволяет использовать все встроенные script/style), так что вы по-прежнему сохраняете ключевую функцию CSP, запрещающую inline script/style вообще.

Таким образом, атрибут nonce - это способ сообщить браузерам, что встроенное содержимое определенного элемента script или стиля не было введено в документ какой-либо (злонамеренной) третьей стороной, но вместо этого было помещено в документ намеренно тот, кто контролирует сервер, от документа.

https://developers.google.com/web/fundamentals/security/csp/#if_you_absolutely_must_use_it дает хороший пример использования атрибута nonce, который сводится к следующим шагам:

  • Для каждого запроса, который ваш веб-сервер получает для определенного документа, создайте свою базу данных с произвольной базой с кодировкой base64 из не менее 128 бит данных из криптографически безопасного генератора случайных чисел; например, EDNnf03nceIOfn39fn3e9h3sdfa. Это ваш nonce.

  • Возьмем nonce, сгенерированный на шаге 1, и для любого встроенного script/style вы хотите "белый список", сделайте свой код backend вставить атрибут nonce в документ до его отправки по провод с этим nonce как значение:

    <script nonce="EDNnf03nceIOfn39fn3e9h3sdfa">…</script>
    
  • Возьмите nonce, сгенерированный на шаге 1, добавьте nonce- к нему, и сделайте ваш backend сгенерируйте заголовок CSP с тем, что среди значений исходного списка для script-src или style-src:

    Content-Security-Policy: script-src 'nonce-EDNnf03nceIOfn39fn3e9h3sdfa'
    

Таким образом, механизм использования nonce является альтернативой вместо того, чтобы ваш backend генерировал хэш содержимого встроенных script или style, которые вы хотите разрешить, а затем указывая, что хеш в соответствующем списке источников в ваш заголовок CSP.

Обратите внимание, что, поскольку браузеры не могут (не могут) проверять, что переданное значение nonce изменяется между запросами страницы, его возможное, хотя и совершенно нецелесообразное, чтобы пропустить 1 выше и не использовать ваш бэкэнд для динамического изменения для nonce, и в этом случае вы могли бы просто поместите атрибут nonce со статическим значением в источник HTML вашего документа и отправьте статический заголовок CSP с тем же значением nonce.

Но причина, по которой вы не хотите использовать статический nonce таким образом, в значительной степени побеждает всю цель использования nonce для начала, потому что, если бы вы использовали статическое nonce, подобное этому, что вы могли бы просто использовать unsafe-inline.