Связанный сценарий jQuery из Cloudflare CDN выдает ошибку CSP в консоли на «sub-include» underscore-min.js - PullRequest
0 голосов
/ 29 января 2019

В настоящее время у меня есть:

<script rel="preload" as="script" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous"></script>

И у меня настроено правило CSP:

add_header Content-Security-Policy: "default-src 'self' https:; script-src 'self' 'sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=';";

Но я получаю следующую ошибку в консоли Chrome:

Отказался от загрузки сценария 'https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js', поскольку он нарушает следующую директиву политики безопасности содержимого: "script-src' self '' sha256-FgpCb / KJQlLNfOu91ta32o / NMZxltwRo8QtmkMRdAu8 = '".Обратите внимание, что «script-src-elem» не был задан явно, поэтому «script-src» используется в качестве запасного варианта.

Как это исправить?Нужно ли явно включать underscore-min.js (и любые дополнительные «включенные» зависимости) в мой HTML-документ?Могу ли я вместо этого занести в белый список все сценарии из cdnjs.cloudflare.com?

Спасибо!

Редактировать: Вот скриншот ошибки консоли, которая, по-видимому, происходит в jquery.min.js file.

Console Error

Кроме того, не уверен, что это актуально, но я получаю Unrecognized Content-Security-Policy directive ':' с https: частью правилачто я нашел в какой-то статье Google devtools или где-то еще.Но я думаю, что двоеточие недопустимо для правил CSP в nginx?

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

Политика безопасности содержимого: игнорирование «unsafe-inline» в script-src: указано «strict-dynamic»

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

add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' https://cdnjs.cloudflare.com https://stackpath.bootstrapcdn.com https://ssl.google-analytics.com https://www.google.com https://www.gstatic.com; img-src 'self' data: https://ssl.google-analytics.com; style-src 'self' 'unsafe-inline' https://stackpath.bootstrapcdn.com https://fonts.googleapis.com; font-src 'self' https://themes.googleusercontent.com; frame-src https://www.google.com; object-src 'none';";

Да, я знаю, что у меня есть 'unsafe-inline' подарокв моих правилах script-src и style-src, пытаясь заставить сайт работать в FireFox.Если веб-сайт больше не отображает или не работает должным образом в FireFox из-за ошибки в реализации CSP FF (требуется подтверждение), тогда цель CSP является вторичной и, следовательно, неактуальной (пока эта ошибка ожидает подтверждения не будет устранена).

Поскольку кажется, что на момент написания CSP информация относительно ограничена, может ли кто-нибудь пролить свет на то, почему FireFox заставляет 'strict-dynamic' вводить в правила CSP, несмотря на то, что он нигде не присутствует в определении правила?Это подразумевается или иным образом дополнено интерпретацией FireFox (частью) моего текущего правила CSP?

Спасибо за вашу помощь.

И для всех, кто читает по CSP, взгляните наhttps://cspvalidator.org/, который может помочь вам отладить ваши собственные правила CSP.Я знаю, это помогло мне!

1 Ответ

0 голосов
/ 01 февраля 2019

Для тех, кто скрывается без разрешения, я выделил проблему, связанную с тем, как FireFox в настоящее время обрабатывает атрибут rel="preload".По меньшей мере, это не очень хорошо, и я предполагаю, что то же самое в Edge.

TL; DR: Не используйте rel="preload", пока оно не будет обработано более равномерно в основных браузерах.Кроме того, мой вопрос заключался в использовании jQuery из CloudFlare CDN, и цель CDN состоит в том, чтобы запретить посетителям (бессмысленно) загружать один и тот же контент снова и снова.Другими словами, rel="preload" не только действует по-разному между флагманскими браузерами, но и лишним, потому что смысл CDN в том, что посетитель будет уже загружать данный файл (ы) при посещении предыдущих веб-сайтов, которыетакже используйте тот же файл из того же CDN.

Нажмите здесь , чтобы просмотреть обзор текущей поддержки браузера для rel="preload".


Выводы

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

Существует ряд проблем, с которыми я столкнулся при устранении неполадок в моих правилах CSP.Одним из них является то, что связывание атрибута as с typehint может работать против вас с текущими реализациями CSP в браузерах.Например, я пытался загрузить шрифт Google с as="font" подарком, который, если я правильно помню, вызывал дополнительные головные боли, пока вместо него не было установлено значение as="style".Я собрал (пожалуйста, добавьте / отредактируйте этот ответ, если вы можете проверить иначе), что это связано с тем, что связанный ресурс действительно является таблицей стилей, а не файлом шрифта.

Еще одна странная вещь, с которой я столкнулся, заключается в том, чтокогда вы предварительно загружаете ресурс, вы должны фактически «инициализировать» данный ресурс после его загрузки.Таким образом, вы можете либо клонировать элемент <link> с желаемым rel="stylesheet/script/etc" (который прямо противоположен принципу DRY), либо присоединить событие onload к элементу <link> (который не идет вразрез с DRY)., но действительно выглядит довольно архаично. Это 2019 год! Почему наш браузер не может сделать это для нас? Или, возможно, мы могли бы добавить поддержку браузера для чего-то вроде атрибута append="true", который автоматически и изящно обработайте это для нас).

Я подниму следующий абзац и фрагмент кода из следующего проекта GitHub , чтобы лучше объяснить onload «решение» (которое делает * 1044)* не работает в FireFox из-за ошибок CSP, которые я задокументировал в этом вопросе):

В браузерах, которые его поддерживают, атрибут rel=preload заставит браузер извлечь таблица стилей, но она не будет применять CSS после загрузки (просто извлекает ее).Чтобы решить эту проблему, мы рекомендуем использовать для ссылки атрибут onload, который будет применять CSS после завершения загрузки.

<link rel="preload" href="path/to/mystylesheet.css" as="style" onload="this.rel='stylesheet'">

Как уже говорилось, это выглядит очень архаично.Нам не нужно выбирать между избыточным и архаичным кодом.

Я упомянул, что в Chrome реализована лучшая производственная реализация CSP, но предстоит еще проделать определенную работу.Кроме того, причина, по которой я завел эту дикую охоту на ведьм, была (естественно), что я работал над улучшением скорости и производительности веб-сайта, поэтому я использовал инструмент Lightouse / Audit от Chrome Inspector.Из всего проведенного мною тестирования может показаться, что ресурсы, которые мы должны ожидать, уже будут кэшироваться на компьютере клиента (Bootstrap, jQuery, Google Fonts и т. Д.), Очищаются перед выполнением аудита и перезагружаются для учета.в сгенерированном отчете.Это хорошо (я понимаю, что это желаемое поведение);однако, если бы у нас был разработчик радиобокса для переопределения очистки общих ресурсов через CDN при проведении наших аудитов, я считаю, что разработчик получил бы дополнительный уровень понимания производительности своего веб-сайта.Или, по крайней мере, дифференцируйте отчет, чтобы точно указать, сколько времени было потрачено на загрузку и инициализацию связанных ресурсов.

Эти зависимости не ограничиваются rel="preload".При устранении неполадок в некоторых случаях я пытался использовать альтернативные значения, например rel="connect", на первом ресурсе, с которым я ссылался, через CDN CloudFlare.При проведении исследования по этой теме я обнаружил следующую статью с этой информацией:

Последний совет о ресурсах, о котором мы хотим поговорить, - это предварительное соединение.Предварительное подключение позволяет браузеру установить ранние подключения до того, как HTTP-запрос действительно будет отправлен на сервер .Это включает DNS-запросы, TLS-согласования, TCP-подтверждения.Это, в свою очередь, устраняет задержку в обоих направлениях и экономит время для пользователей.

«Предварительное соединение - важный инструмент в вашем наборе инструментов оптимизации… оно может исключить множество дорогостоящих обращений из вашего пути запроса - в некоторых случаях уменьшая задержку запроса в сотни раз идаже тысячи миллисекунд.- Илья Григорик »

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...