Поведение, описанное в вопросе, на самом деле является ожидаемым поведением - требуется согласно спецификации HTML:
https://html.spec.whatwg.org/multipage/#nonce-attributes:attr-nonce
Элементы, имеющие атрибут содержимого nonce, гарантируют, что одноразовый crytographicпредоставляется только сценарию (а не побочным каналам, таким как селекторы атрибутов CSS), извлекая значение из атрибута содержимого, перемещая его во внутренний слот с именем [[CryptographicNonce]]
https://html.spec.whatwg.org/multipage/#nonce-attributes:dom-noncedelement-nonce
… установщик для атрибута nonce
IDL не обновляет соответствующий атрибут содержимого.Это, а также установка ниже атрибута содержимого nonce
для пустой строки, когда элемент становится подключенным к контексту просмотра, предназначены для предотвращения эксфильтрации одноразового значения с помощью механизмов, которые могут легко считывать атрибуты содержимого, такие как селекторы.
Это поведение было добавлено в обновлении спецификации в https://github.com/whatwg/html/pull/2373 ( «Скрыть nonce
значения атрибута содержимого» * 1024 *) после первого предложения в https://github.com/whatwg/html/issues/2369.
Для ясности: поведение, которое требует спецификация, заключается в том, что если источник разметки, который вы обслуживаете по проводам, имеет следующий вид:
<script nonce=DhcnhD3khTMePgXw>...</script>
… тогда, если вы откроете devtools браузера и используете инспектор DOMвместо этого вы увидите следующее:
<script nonce>...</script>
То есть инспектор DOM не будет показывать значение атрибута nonce
для этого элемента script
.
более точно, вы не увидите значения атрибута nonce
в этом script
, если документ обслуживается заголовком Content-Security-Policy
, и браузер применяет политику в этом заголовке.
ЕслиВы не обслуживайте документ с заголовком Content-Security-Policy
, или браузер не применяет политику из него, вы увидите nonce=DhcnhD3khTMePgXw
для элемента script
в инспекторе.
Таким образом, отсутствие значения для этого атрибута nonce
в инспекторе DOM фактически указывает на то, что все работает так, как ожидалось.То есть он указывает, что браузер проверяет значение на совпадение с любыми nonce-*
исходными выражениями в заголовке Content-Security-Policy
.
То, как он работает внутри браузера, - браузер перемещает nonce
Значение атрибута для «внутреннего слота» для собственного использования браузером.Таким образом, он остается доступным для браузера, но скрыт от DOM.
Причина, по которой вы еще не видите того же поведения, что и Chrome в других браузерах, заключается в том, что другие браузеры не догнали обновление спецификации ивыполнил требование.Но есть открытые ошибки:
Для проверкиесли ваш браузер соответствует спецификации, вы можете использовать тесты здесь:
А текущие результаты этих тестов в основных браузерах приведены здесь: