Какова цель HTML-атрибута «nonce» для элементов скрипта и стиля?

142

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

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

ата
источник
2
Похоже, это просто дополнительная защита для вашего сайта, вы добавляете его в ссылку или форму, и когда страница обслуживается, если одноразовый номер не совпадает с вашим, вы не обслуживаете страницу
Пит,
@Pete Ты имеешь в виду, что тогда никто не сможет загрузить твою scriptи style? Что-то вроде бана хотлинка?
ата
это также для обычных страниц и проверки форм
Пит,

Ответы:

198

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атрибут, который состоит из следующих шагов:

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

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

    <script nonce="EDNnf03nceIOfn39fn3e9h3sdfa"></script>
  3. Возьмите одноразовый номер, сгенерированный на шаге 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.

sideshowbarker
источник
17
Это не для проверки пользователя - это для проверки того, что встроенное содержимое определенного скрипта или элемента стиля не было внедрено в документ моей какой-то (злонамеренной) третьей стороной, а вместо этого было намеренно помещено в документ тем, кто контролирует сервер документа. подается из. (Я буду обновлять мой ответ сказать.)
sideshowbarker
3
Одноразовые значения не нужно хранить - вместо этого они генерируются в памяти и вставляются в заголовок CSP и HTML-документ, который отправляется по сети в ответах (не в источник, хранящийся в файловой системе / базе данных сервера).
sideshowbarker
3
Что касается каких-либо причин для использования nonceатрибута, если вам абсолютно не нужно его использовать, не делайте этого. На самом деле это предназначено только для случаев, когда по какой-то причине вы не можете (пока) избавиться от некоторого встроенного скрипта или содержимого стиля из определенного документа (но его следует удалить позже). Поэтому, если по какой-то причине вы застряли с необходимостью сохранять встроенный скрипт и содержимое стиля, то тем временем вы можете по крайней мере использовать механизм nonce, чтобы позволить браузерам проверить, что они в порядке. В противном случае вы просто должны полностью использовать ПЕС , как на самом деле предназначены, и не допускать любому инлайн - скрипт , или стиль элементов
sideshowbarker
2
@sideshowbarker, что делает пустой nonce? Я вижу страницы с <script type="text/javascript" nonce>и<style type="text/css" nonce>
Pacerier
7
Примечание. Если ваш сценарий статический, я рекомендую хэш CSP, а не одноразовый номер.
Брайан