Яке призначення атрибута HTML "nonce" для елементів сценарію та стилю?


140

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

Я погуглився про це, але нарешті не зрозумів, що насправді робить цей атрибут та що змінюється при його використанні?


2
Схоже, це просто додатковий захист для вашого сайту, ви додаєте його до посилання чи форми, і коли сторінка розміщена, якщо ніколи не відповідає вашій, ви не обслуговуєте сторінку
Pete

@Pete Ви маєте в виду , то ніхто не може завантажити ваші scriptі style? Щось на кшталт заборони гарячої посилання?
ата

це також для звичайних сторінок та перевірки форм
Піт

Відповіді:


195

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

Таким чином, nonceатрибут - це спосіб повідомляти браузерам, що вбудований вміст певного сценарію чи стильового елемента не був введений в документ деякими (зловмисними) сторонніми сторонами, а замість цього був навмисно введений у документ тим, хто контролює сервер, який подає документ. з.

https://developers.google.com/web/fundamentals/security/csp/#if_you_absgether_must_use_it дає хороший приклад використання nonceатрибута, який відповідає наступним крокам:

  1. Для кожного запиту, який ваш веб-сервер отримує для певного документа, попросіть ваш сервер створити випадкову базову 64-кодову рядок щонайменше з 128 біт даних із криптографічно захищеного генератора випадкових чисел; наприклад, EDNnf03nceIOfn39fn3e9h3sdfa. Це твоє поняття.

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

    <script nonce="EDNnf03nceIOfn39fn3e9h3sdfa"></script>
  3. Візьміть одноразовий номер згенерований на кроці 1, забезпечите nonce-його, і зробити свій бекенд генерувати ПЕС заголовок з , що серед значень вихідного списку для script-srcабо style-src:

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

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

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

Але причина, по якій ви не хочете використовувати статичний поняття таким чином, полягає в тому, що це, в значній мірі, переможе всю ціль використання нонсету для початку, тому що, якби ви використовували статичний не так, в цей момент ви також можете просто використовувати unsafe-inline.


17
Це не для перевірки користувача - це для перевірки того, що вкладений вміст певного сценарію чи стильового елемента не був введений у документ моєю деякою (зловмисною) третьою стороною, а був замість цього навмисно введений у документ тим, хто контролює сервер документа. подається від. (Я оновлю свою відповідь, щоб сказати це.)
sidehowbarker

3
Думки не потрібно зберігати - натомість вони генеруються в пам'яті та вставляються в заголовок CSP та HTML-документ, що надсилається по проводу у відповідях (не до джерела, що зберігається у серверній файловій системі / базі даних).
sidehowbarker

3
Що стосується будь-якої причини докладати зусиль для використання nonceатрибута, якщо вам абсолютно не потрібно його використовувати, тоді не робіть. Це дійсно призначено лише для тих випадків, коли з певних причин ви не можете (поки) позбутися вмісту сценарію чи стилю з певного документа (але його слід видалити пізніше). Тож якщо з якихось причин вам не доводиться зберігати вбудований вміст сценарію та стилю, то в той же час ви можете принаймні використовувати механізм nonce, щоб браузери перевірили, що вони в порядку. В іншому випадку слід просто повністю використовувати CSP так, як насправді було призначено, і не допускати вбудованого сценарію чи елементів стилю
sideshowbarker

2
@sideshowbarker, що робить порожнє слово? Я бачу сторінки з <script type="text/javascript" nonce>і<style type="text/css" nonce>
Pacerier

7
Примітка: Якщо ваш сценарій статичний, я рекомендую хеш CSP, а не nonce.
Брайан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.