ASP.NET Core Script Tag Helper asp-fallback-src не проходит проверку целостности - PullRequest
0 голосов
/ 30 мая 2018

Я получаю следующую ошибку при тестировании отката к локальному файлу с помощью помощника по тегам скрипта ядра ASP.NET:

Не удалось найти действительный дайджест в атрибуте «целостности»для ресурса 'http://localhost:48888/js/jquery.min.js' с вычисленной целостностью SHA-256' oozPintQUive6gzYPN7KIhwY / B + d8 + 5rPTxI1ZkgaFU = '.Ресурс заблокирован.

Локальный файл - это текст, равный версии CDN, но не двоичный.Это становится проблемой, поскольку хэш целостности сравнивается не только с основным источником, но и с резервным источником, и не проходит проверку, поскольку он генерирует другой хэш.

Вот пример:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"
    asp-fallback-src="~/js/jquery.min.js"
    asp-fallback-test="window.jQuery"
    crossorigin="anonymous"
    integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=">
</script>

Это прекрасно работает, если браузер может получить доступ к CDN Google.Но если вы измените источник на неверное значение, например, ищите несуществующую версию, такую ​​как «3.9.9», которая вызывает откат к локальному файлу.Этот локальный файл не удастся загрузить, потому что они не равны двоично (разные хэши).

В идеале проверка целостности не должна применяться к локальным файлам, поскольку мы доверяем локальному файлу под нашим контролем.Альтернатива состоит в том, что мы можем определить другой хеш для локального запасного варианта.

Доступен ли какой-либо из этих вариантов?Если нет, есть ли другой обходной путь?Я стараюсь избегать ручного копирования из CDN, чтобы они соответствовали друг другу, из-за дополнительной работы по обслуживанию, необходимой для будущих обновлений.Я хотел бы использовать менеджер пакетов.

Ответы [ 3 ]

0 голосов
/ 31 мая 2018

Опция 1

Вы можете прекратить использование CDN и вместо этого подавать файл из пакета NPM.Вы можете запустить свой сайт за службой, такой как Cloudflare, которая может кешировать файлы для вас глобально.

Вариант 2

Добавьте в свою сборку шаг (webpack, gulp или любой другой), чтобы скопировать файлиз CDN напрямую.Я не уверен, почему их файл не имеет двоичного значения.

Опция 3

Если какой-либо из перечисленных выше вариантов слишком сложен, вы можете прекратить использование SRI.Это уравнение стоимости против стоимости.Только вы можете решить, стоит ли это усилий.Я не думаю, что вы можете отключить хеш в зависимости от того, является ли это локальным или удаленным файлом.

0 голосов
/ 26 декабря 2018

С недавно выпущенным ASP.NET Core 2.2.0 с декабря 2018 года и LinkTagHelper, и ScriptTagHelper получили новое логическое свойство asp-suppress-fallback-integrity.Если задано значение true, резервный ресурс будет обходить проверку целостности.

Это необходимо, когда распределение CDN и NPM двоично, как в случае Font Awesome 5.

<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.6.3/css/all.css" integrity="sha384-UHRtZLI+pbxtHCWp1t77Bi1L4ZtiqrqD80Kn4Z8NTSRyMA2Fd33n5dQ8lWUE00s/" crossorigin="anonymous"
          asp-fallback-href="~/lib/font-awesome/css/all.min.css"
          asp-fallback-test-class="fab" asp-fallback-test-property="font-style" asp-fallback-test-value="normal"
          asp-suppress-fallback-integrity="true" />

Наличное замечание, я не вижу смысла в проверке целостности локальных ресурсов.Это требует высокого технического обслуживания и сопряжено с высоким риском аннулирования аварийного отката, что губительно и без сложных испытаний, требующих симуляции сбоя CDN с каждой новой версией, которую трудно обнаружить.Поэтому я предпочитаю добавлять это свойство ко всем ресурсам.

0 голосов
/ 31 мая 2018

В настоящее время нет готового решения, и неясно, когда оно будет реализовано (см. здесь ).Более того, у меня тоже была эта проблема, и я не смог найти изящного обходного пути.Тем не менее, у нас есть два варианта:

  1. Реализация собственного ScriptTagHelper с использованием исходного кода и исключение атрибута integrity из FallbackBlock.
  2. Неиспользовать ScriptTagHelper и написать, что он производит, за исключением атрибута integrity в FallbackBlock:
<script 
    src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js" 
    crossorigin="anonymous" 
    integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=">
</script>
<script>(window.jQuery||document.write("\u003Cscript src=\u0022\/js\/jquery.min.js\u0022 crossorigin=\u0022anonymous\u0022 \u003E\u003C\/script\u003E"));</script>
...