Google Chrome Удаление одноразовых значений из тегов скрипта - PullRequest
2 голосов
/ 14 апреля 2019

Я пытаюсь добавить одноразовые значения в мои встроенные скрипты, чтобы удовлетворить более строгий CSP. Однако я сталкиваюсь со странной проблемой, когда chrome удаляет значение из атрибутов nonce. Когда я скручиваю страницу, значения nonce присутствуют. Это приводит к тому, что сценарий не выполняется, поскольку теперь он не проходит тест CSP. Я думал, что это может быть связано с мошенническим расширением, но оно не работает на совершенно чистой версии Chrome. (Версия 73.0.3683.103 для OSX) Значение для одноразового номера - это случайная строка с 256-битовым базовым кодированием, поэтому она должна удовлетворять всем требованиям для одноразового номера.

Кто-нибудь знает, что происходит? Я что-то не так делаю?

1 Ответ

2 голосов
/ 14 апреля 2019

Поведение, описанное в вопросе, на самом деле является ожидаемым поведением - требуется согласно спецификации 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 в других браузерах, заключается в том, что другие браузеры не догнали обновление спецификации ивыполнил требование.Но есть открытые ошибки:


Для проверкиесли ваш браузер соответствует спецификации, вы можете использовать тесты здесь:

А текущие результаты этих тестов в основных браузерах приведены здесь:

...