Поделиться через


Применение политики безопасности содержимого для ASP.NET Core Blazor

Примечание.

Это не последняя версия этой статьи. В текущем выпуске см. версию этой статьи для .NET 9.

Предупреждение

Эта версия ASP.NET Core больше не поддерживается. Дополнительные сведения см. в политике поддержки .NET и .NET Core. В текущем выпуске см. версию этой статьи .NET 9.

Внимание

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

В текущем выпуске смотрите версию этой статьи .NET 9.

В этой статье вы узнаете, как использовать политику безопасности содержимого (CSP) с приложениями ASP.NET Core Blazor для защиты от атак с выполнением межсайтовых сценариев (XSS). Дополнительные сведения о синтаксисе CSP см. в справочнике по CSP MDN.

Межсайтовые скрипты (XSS) — это уязвимость безопасности, при которой кибератака помещает один или несколько вредоносных скриптов на стороне клиента в отрисованное содержимое приложения. Политика безопасности содержимого (CSP) помогает защититься от атак XSS, информируя браузер о допустимых источниках:

  • Источники загруженного содержимого, включая скрипты, таблицы стилей, изображения и подключаемые модули.
  • действий, выполняемых страницей, с указанием разрешенных целевых объектов URL-адресов форм;

Чтобы применить CSP к приложению, разработчик указывает несколько директив безопасности содержимого CSP в одном или нескольких заголовках Content-Security-Policy или тегах <meta>. Рекомендации по применению CSP к приложению в коде C# при запуске см. в статье Запуск Blazor ASP.NET Core.

Политики оцениваются браузером во время загрузки страницы. Браузер проверяет источники страницы и определяет, соответствуют ли они требованиям директив безопасности содержимого. Если директивы политики не выполняются для ресурса, браузер не загружает ресурс. Например, рассмотрим политику, которая не позволяет использовать сценарии сторонних разработчиков. Если страница содержит тег <script>, в атрибуте src которого указан сторонний источник, браузер предотвращает загрузку сценария.

CSP поддерживается в большинстве современных браузеров для настольных ПК и мобильных устройств, включая Chrome, Microsoft Edge, Firefox, Opera и Safari. CSP рекомендуется для приложений Blazor.

Директивы политики

Как минимум, укажите следующие директивы и источники для приложений Blazor. При необходимости добавьте дополнительные директивы и источники. В разделе "Применить политику" этой статьи используются следующие директивы, в которых приведены примеры политик безопасности для Blazor приложений:

  • base-uri: ограничивает URL-адреса для тега <base> страницы. Укажите self, чтобы отметить, что источник приложения, включая схему и номер порта, является допустимым источником.
  • default-src. Указывает резервный вариант для исходных директив, которые явно не указаны политикой. Укажите self, чтобы отметить, что источник приложения, включая схему и номер порта, является допустимым источником.
  • img-src: указывает допустимые источники для изображений.
    • Укажите data:, чтобы разрешить загрузку изображений с URL-адресов data:.
    • Укажите https:, чтобы разрешить загрузку изображений с конечных точек HTTPS.
  • object-src: указывает допустимые источники для тегов <object>, <embed>и <applet>. Укажите none, чтобы запретить все источники URL-адресов.
  • script-src: указывает допустимые источники для скриптов.
    • Укажите self, чтобы отметить, что источник приложения, включая схему и номер порта, является допустимым источником.
    • В клиентском Blazor приложении:
      • Укажите wasm-unsafe-eval , чтобы разрешить клиентской Blazor среде выполнения Mono функционировать.
      • Укажите любые дополнительные хэши, чтобы разрешить загрузку требуемых скриптов, не связанных с платформой.
    • В серверном Blazor приложении укажите хэши, чтобы разрешить загрузку необходимых скриптов.
  • style-src. Указывает допустимые источники для таблиц стилей.
    • Укажите self, чтобы отметить, что источник приложения, включая схему и номер порта, является допустимым источником.
    • Если приложение использует встроенные стили, укажите unsafe-inline, чтобы разрешить их использование.
  • upgrade-insecure-requests: указывает, что URL-адреса содержимого из небезопасных источников (HTTP) должны быть безопасно приобретены по протоколу HTTPS.
  • base-uri: ограничивает URL-адреса для тега <base> страницы. Укажите self, чтобы отметить, что источник приложения, включая схему и номер порта, является допустимым источником.
  • default-src. Указывает резервный вариант для исходных директив, которые явно не указаны политикой. Укажите self, чтобы отметить, что источник приложения, включая схему и номер порта, является допустимым источником.
  • img-src: указывает допустимые источники для изображений.
    • Укажите data:, чтобы разрешить загрузку изображений с URL-адресов data:.
    • Укажите https:, чтобы разрешить загрузку изображений с конечных точек HTTPS.
  • object-src: указывает допустимые источники для тегов <object>, <embed>и <applet>. Укажите none, чтобы запретить все источники URL-адресов.
  • script-src: указывает допустимые источники для скриптов.
    • Укажите self, чтобы отметить, что источник приложения, включая схему и номер порта, является допустимым источником.
    • В клиентском Blazor приложении:
      • Укажите unsafe-eval , чтобы разрешить клиентской Blazor среде выполнения Mono функционировать.
      • Укажите любые дополнительные хэши, чтобы разрешить загрузку требуемых скриптов, не связанных с платформой.
    • В серверном Blazor приложении укажите хэши, чтобы разрешить загрузку необходимых скриптов.
  • style-src. Указывает допустимые источники для таблиц стилей.
    • Укажите self, чтобы отметить, что источник приложения, включая схему и номер порта, является допустимым источником.
    • Если приложение использует встроенные стили, укажите unsafe-inline, чтобы разрешить их использование.
  • upgrade-insecure-requests. Указывает, что URL-адреса содержимого из небезопасных источников (HTTP) должны быть безопасно приобретены по протоколу HTTPS.
  • base-uri: ограничивает URL-адреса для тега <base> страницы. Укажите self, чтобы отметить, что источник приложения, включая схему и номер порта, является допустимым источником.
  • default-src. Указывает резервный вариант для исходных директив, которые явно не указаны политикой. Укажите self, чтобы отметить, что источник приложения, включая схему и номер порта, является допустимым источником.
  • img-src: указывает допустимые источники для изображений.
    • Укажите data:, чтобы разрешить загрузку изображений с URL-адресов data:.
    • Укажите https:, чтобы разрешить загрузку изображений с конечных точек HTTPS.
  • object-src: указывает допустимые источники для тегов <object>, <embed>и <applet>. Укажите none, чтобы запретить все источники URL-адресов.
  • script-src: указывает допустимые источники для скриптов.
    • Укажите https://stackpath.bootstrapcdn.com/ источник хоста для Bootstrap скриптов.
    • Укажите self, чтобы отметить, что источник приложения, включая схему и номер порта, является допустимым источником.
    • В клиентском Blazor приложении:
      • Укажите unsafe-eval , чтобы разрешить клиентской Blazor среде выполнения Mono функционировать.
      • Укажите любые дополнительные хэши, чтобы разрешить загрузку требуемых скриптов, не связанных с платформой.
    • В серверном Blazor приложении укажите хэши, чтобы разрешить загрузку необходимых скриптов.
  • style-src. Указывает допустимые источники для таблиц стилей.
    • Укажите источник узла https://stackpath.bootstrapcdn.com/ для таблиц стилей Bootstrap.
    • Укажите self, чтобы отметить, что источник приложения, включая схему и номер порта, является допустимым источником.
    • Укажите unsafe-inline, чтобы разрешить использование встроенных стилей.
  • upgrade-insecure-requests. Указывает, что URL-адреса содержимого из небезопасных источников (HTTP) должны быть безопасно приобретены по протоколу HTTPS.
  • base-uri: ограничивает URL-адреса для тега <base> страницы. Укажите self, чтобы отметить, что источник приложения, включая схему и номер порта, является допустимым источником.
  • default-src. Указывает резервный вариант для исходных директив, которые явно не указаны политикой. Укажите self, чтобы отметить, что источник приложения, включая схему и номер порта, является допустимым источником.
  • img-src: указывает допустимые источники для изображений.
    • Укажите data:, чтобы разрешить загрузку изображений с URL-адресов data:.
    • Укажите https:, чтобы разрешить загрузку изображений с конечных точек HTTPS.
  • object-src: указывает допустимые источники для тегов <object>, <embed>и <applet>. Укажите none, чтобы запретить все источники URL-адресов.
  • script-src: указывает допустимые источники для скриптов.
    • Укажите исходный хост https://stackpath.bootstrapcdn.com/ для скриптов Bootstrap.
    • Укажите self, чтобы отметить, что источник приложения, включая схему и номер порта, является допустимым источником.
    • В клиентском Blazor приложении:
      • Укажите хэши, чтобы разрешить загрузку необходимых сценариев.
      • Укажите unsafe-eval, чтобы использовать eval() и методы для создания кода из строк.
    • В серверном Blazor приложении укажите хэши, чтобы разрешить загрузку необходимых скриптов.
  • style-src. Указывает допустимые источники для таблиц стилей.
    • Укажите источник узла https://stackpath.bootstrapcdn.com/ для таблиц стилей Bootstrap.
    • Укажите self, чтобы отметить, что источник приложения, включая схему и номер порта, является допустимым источником.
    • Укажите unsafe-inline, чтобы разрешить использование встроенных стилей. Встроенное объявление требуется для пользовательского интерфейса для повторного подключения клиента и сервера после первоначального запроса. В будущих выпусках встроенные стили, возможно, будут удалены, и тогда unsafe-inline больше не потребуется.
  • upgrade-insecure-requests. Указывает, что URL-адреса содержимого из небезопасных источников (HTTP) должны быть безопасно приобретены по протоколу HTTPS.

Предыдущие директивы поддерживаются всеми браузерами, кроме Microsoft Internet Explorer.

Порядок получения хэшей SHA для дополнительных встроенных сценариев:

  • Примените CSP, показанный в разделе Применение политики.
  • Доступ к консоли средств разработчика в браузере при локальном запуске приложения. Браузер вычисляет и отображает хэши для заблокированных сценариев при наличии заголовка CSP или тега meta.
  • Скопируйте хэши, предоставленные браузером, в источники script-src. Заключите каждый хэш в одинарные кавычки.

Матрицу поддержки политики безопасности содержимого уровня 2 см. на странице «Можно ли использовать: политика безопасности содержимого уровня 2».

Применение политики

Используйте тег <meta>, чтобы применить политику:

  • Присвойте атрибуту http-equiv значение Content-Security-Policy.
  • Поместите директивы в значение атрибута content. Директивы следует разделять точкой с запятой (;).
  • Всегда помещайте тег meta в <head> содержимое.

В следующих разделах показаны примеры политик. Эти примеры приведены в этой статье и отслеживаются для каждой версии Blazor. Чтобы использовать версию, подходящую для выпуска, выберите версию документа с раскрывающимся списком версий на этой веб-странице.

Серверные Blazor приложения

В содержимом<head>примените директивы, описанные в разделе "Директивы политики":

<meta http-equiv="Content-Security-Policy" 
      content="base-uri 'self';
               default-src 'self';
               img-src data: https:;
               object-src 'none';
               script-src 'self';
               style-src 'self';
               upgrade-insecure-requests;">
<meta http-equiv="Content-Security-Policy" 
      content="base-uri 'self';
               default-src 'self';
               img-src data: https:;
               object-src 'none';
               script-src https://stackpath.bootstrapcdn.com/ 
                          'self';
               style-src https://stackpath.bootstrapcdn.com/
                         'self' 
                         'unsafe-inline';
               upgrade-insecure-requests;">
<meta http-equiv="Content-Security-Policy" 
      content="base-uri 'self';
               default-src 'self';
               img-src data: https:;
               object-src 'none';
               script-src https://stackpath.bootstrapcdn.com/ 
                          'self' 
                          'sha256-34WLX60Tw3aG6hylk0plKbZZFXCuepeQ6Hu7OqRf8PI=';
               style-src https://stackpath.bootstrapcdn.com/
                         'self' 
                         'unsafe-inline';
               upgrade-insecure-requests;">

Добавьте дополнительные хэши script-src и style-src, необходимые этому приложению. Во время разработки используйте интерактивное средство или средства разработчика браузера, которые будут вычислять хэши. Например, следующая ошибка консоли средств браузера сообщает о том, что хэш для необходимого сценария не охвачен политикой:

Не удается выполнить встроенный сценарий, так как он нарушает следующую директиву политики безопасности содержимого: "...". Для включения выполнения встроенного сценария требуется ключевое слово "unsafe-inline", хэш ("sha256-v8v3RKRPmN4odZ1CWM5gw80QKPCCWMcpNeOmimNL2AA=") или nonce ("nonce-...").

Конкретный сценарий, связанный с ошибкой, отображается в консоли рядом с ошибкой.

Рекомендации по применению CSP к приложению в коде C# при запуске см. в статье Запуск Blazor ASP.NET Core.

Клиентские Blazor приложения

В содержимом<head>примените директивы, описанные в разделе "Директивы политики":

<meta http-equiv="Content-Security-Policy" 
      content="base-uri 'self';
               default-src 'self';
               img-src data: https:;
               object-src 'none';
               script-src 'self'
                          'wasm-unsafe-eval';
               style-src 'self';
               upgrade-insecure-requests;">
<meta http-equiv="Content-Security-Policy" 
      content="base-uri 'self';
               default-src 'self';
               img-src data: https:;
               object-src 'none';
               script-src 'self' 
                          'unsafe-eval';
               style-src 'self';
               upgrade-insecure-requests;">
<meta http-equiv="Content-Security-Policy" 
      content="base-uri 'self';
               default-src 'self';
               img-src data: https:;
               object-src 'none';
               script-src 'self' 
                          'sha256-v8v3RKRPmN4odZ1CWM5gw80QKPCCWMcpNeOmimNL2AA=' 
                          'unsafe-eval';
               style-src 'self';
               upgrade-insecure-requests;">

Примечание.

Хэш sha256-v8v3RKRPmN4odZ1CWM5gw80QKPCCWMcpNeOmimNL2AA= представляет встроенный скрипт, используемый для клиентских Blazor приложений. Эта возможность может быть удалена в будущем.

<meta http-equiv="Content-Security-Policy" 
      content="base-uri 'self';
               default-src 'self';
               img-src data: https:;
               object-src 'none';
               script-src https://stackpath.bootstrapcdn.com/ 
                          'self' 
                          'sha256-v8v3RKRPmN4odZ1CWM5gw80QKPCCWMcpNeOmimNL2AA=' 
                          'unsafe-eval';
               style-src https://stackpath.bootstrapcdn.com/
                         'self'
                         'unsafe-inline';
               upgrade-insecure-requests;">
<meta http-equiv="Content-Security-Policy" 
      content="base-uri 'self';
               default-src 'self';
               img-src data: https:;
               object-src 'none';
               script-src https://stackpath.bootstrapcdn.com/ 
                          'self' 
                          'sha256-v8ZC9OgMhcnEQ/Me77/R9TlJfzOBqrMTW8e1KuqLaqc=' 
                          'sha256-If//FtbPc03afjLezvWHnC3Nbu4fDM04IIzkPaf3pH0=' 
                          'sha256-v8v3RKRPmN4odZ1CWM5gw80QKPCCWMcpNeOmimNL2AA=' 
                          'unsafe-eval';
               style-src https://stackpath.bootstrapcdn.com/
                         'self'
                         'unsafe-inline';
               upgrade-insecure-requests;">

Добавьте дополнительные хэши script-src и style-src, необходимые этому приложению. Во время разработки используйте интерактивное средство или средства разработчика браузера, которые будут вычислять хэши. Например, следующая ошибка консоли средств браузера сообщает о том, что хэш для необходимого сценария не охвачен политикой:

Не удается выполнить встроенный сценарий, так как он нарушает следующую директиву политики безопасности содержимого: "...". Для включения выполнения встроенного сценария требуется ключевое слово "unsafe-inline", хэш ("sha256-v8v3RKRPmN4odZ1CWM5gw80QKPCCWMcpNeOmimNL2AA=") или nonce ("nonce-...").

Конкретный сценарий, связанный с ошибкой, отображается в консоли рядом с ошибкой.

Примените CSP в средах, отличных от Development

Когда CSP применяется к Blazor содержимому приложения <head> , он вмешивается в локальное тестирование в Development среде. Например, ссылка на браузер и скрипт обновления браузера не загружались. В следующих примерах показано, как применить тег CSP <meta> в средах, отличных от Development сред.

Примечание.

Примеры, приведенные в этом разделе, не показывают полный тег <meta> для CSPs. <meta> Полные теги находятся в подразделах раздела "Применить политику" ранее в этой статье.

Доступны три общих подхода:

  • Примените CSP через App компонент, который применяет CSP ко всем макетам приложения.
  • Если необходимо применить CSP к различным областям приложения, например, пользовательскую CSP только для страниц администрирования, примените CSP на основе каждого макета с помощью тега <HeadContent>. Для полной эффективности каждый файл макета приложения должен принять подход.
  • Служба размещения или сервер могут предоставить CSP через Content-Security-Policy заголовок, добавляемый к исходящим ответам приложения. Так как этот подход зависит от размещения службы или сервера, он не рассматривается в следующих примерах. Если вы хотите применить этот подход, обратитесь к документации по поставщику услуг размещения или серверу.

Blazor Web App Подходы

В компоненте App (Components/App.razor) внедрить IHostEnvironment:

@inject IHostEnvironment Env

В содержимом App компонента <head> примените CSP, если он не находится в Development среде:

@if (!Env.IsDevelopment())
{
    <meta ...>
}

Кроме того, примените политики безопасности содержимого для каждого макета в папке Components/Layout, как показано в следующем примере. Убедитесь, что каждый макет определяет Политику безопасности контента (CSP).

@inject IHostEnvironment Env

@if (!Env.IsDevelopment())
{
    <HeadContent>
        <meta ...>
    </HeadContent>
}

Blazor WebAssembly подходы к приложению

В компоненте App (App.razor) внедрите IWebAssemblyHostEnvironment.

@using Microsoft.AspNetCore.Components.WebAssembly.Hosting
@inject IWebAssemblyHostEnvironment Env

В содержимом App компонента <head> примените CSP, когда не находитесь в Development среде.

@if (!Env.IsDevelopment())
{
    <HeadContent>
        <meta ...>
    </HeadContent>
}

Кроме того, используйте предыдущий код, но примените политики безопасности контента на основе макета в папке Layout. Убедитесь, что каждый макет задает CSP.

Ограничения метатегов

Политика тегов <meta> не поддерживает следующие директивы:

Для поддержки предыдущих директив используйте заголовок с именем Content-Security-Policy. Строка директивы — это значение заголовка.

Тестирование политики и получение отчетов о нарушениях

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

Чтобы протестировать политику в течение определенного периода времени без применения директив политики, задайте для атрибута<meta> тега http-equiv или заголовка политики на основе заголовков значение Content-Security-Policy-Report-Only. Отчеты о сбоях отправляются как документы JSON по указанному URL-адресу. Для получения дополнительной информации см. веб-документы MDN: Content-Security-Policy-Report-Only.

Для получения информации об отчетах о нарушениях, когда политика активна, см. следующие статьи:

Хотя report-uri больше не рекомендуется использовать, обе директивы следует использовать до тех пор, пока report-to не будут поддерживаться всеми основными браузерами. Не используйте исключительно report-uri, поскольку поддержка report-uri может быть удалена из браузеров в любое время. Удалите поддержку report-uri в политиках, если report-to полностью поддерживается. Для отслеживания внедрения report-to см. Can I use: report-to.

Протестируйте и обновляйте политику приложения при каждом выпуске новой версии.

Устранение неполадок

  • Ошибки отображаются в консоли средств разработчика браузера. Браузеры предоставляют сведения о следующем:
    • Элементы, которые не соответствуют политике.
    • Как изменить политику, чтобы разрешить заблокированный элемент.
  • Политика полностью эффективна, только если браузер клиента поддерживает все включенные директивы. Сведения о текущей матрице поддержки браузера см. в статье "Можно ли использовать: Content-Security-Policy".

Дополнительные ресурсы