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

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

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

1 ответов


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

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

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

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

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

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

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

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

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

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