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

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

Ответы (1)

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

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

The Web Fundamentals Политика безопасности содержимого статья Если вам абсолютно необходимо ее использовать ... В разделе есть хороший пример того, как использовать атрибут nonce, который сводится к следующим шагам:

  1. For each request your Web server receives for a particular document, have your backend make a random base64-encoded string of at least 128 bits from a cryptographically secure random number generator; e.g., EDNnf03nceIOfn39fn3e9h3sdfa. That’s your nonce.

  2. Take the nonce generated in step 1, and for any inline script/style you want to “whitelist”, make your backend code insert a nonce attribute into the document before it’s sent over the wire, with that nonce as the value:

     
    
  3. Take the nonce generated in step 1, prepend nonce-, and make your backend generate a CSP header with that among the values of the source list for script-src or style-src:

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

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

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

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


Насколько элементы являются «nonceable»: спецификация CSP в настоящее время ограничивает браузеры проверкой одноразовых номеров только для элементов script и style. Вот подробности спецификации:

  • В https://w3c.github.io/webappsec-csp/#match-element-to-source-list, см. Шаг 2:
    Если тип - «сценарий» или «стиль», и §6.6. 3.1 Является ли элемент неприменимым? возвращает "Nonceable"…

  • At https://w3c.github.io/webappsec-csp/#is-element-nonceable, алгоритм Is element nonceable? сам по себе не проверяет только script/стиль элементов; но единственное место, где спецификация вызывает это from, - это часть, указанная выше, которая ограничивает его скриптом и стилем. Поэтому, если вы поместите одноразовый номер в любой другой элемент, текущая спецификация требует, чтобы браузеры игнорировали его.

2022 WebDevInsider