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

Примечание.

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

Внимание

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

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

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

Выполнение межсайтовых сценариев (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/ для сценариев начальной загрузки.
    • Укажите self, чтобы отметить, что источник приложения, включая схему и номер порта, является допустимым источником.
    • В клиентском Blazor приложении:
      • Укажите unsafe-eval , чтобы разрешить клиентской Blazor среде выполнения Mono функционировать.
      • Укажите любые дополнительные хэши, чтобы разрешить загрузку требуемых скриптов, не связанных с платформой.
    • В серверном Blazor приложении укажите хэши, чтобы разрешить загрузку необходимых скриптов.
  • style-src: указывает допустимые источники для таблиц стилей.
    • Укажите источник узла https://stackpath.bootstrapcdn.com/ для таблиц начальной загрузки.
    • Укажите 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/ для сценариев начальной загрузки.
    • Укажите self, чтобы отметить, что источник приложения, включая схему и номер порта, является допустимым источником.
    • В клиентском Blazor приложении:
      • Укажите хэши, чтобы разрешить загрузку необходимых сценариев.
      • Укажите unsafe-eval, чтобы использовать eval() и методы для создания кода из строк.
    • В серверном Blazor приложении укажите хэши, чтобы разрешить загрузку необходимых скриптов.
  • style-src: указывает допустимые источники для таблиц стилей.
    • Укажите источник узла https://stackpath.bootstrapcdn.com/ для таблиц начальной загрузки.
    • Укажите 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-...").

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

Клиентские 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 ко всем макетам приложения.
  • Если необходимо применить поставщики служб csps к разным областям приложения, например пользовательскому поставщику служб CSP только для страниц администрирования, примените поставщики СЛУЖБ на основе каждого макета с помощью тега<HeadContent>. Для полной эффективности каждый файл макета приложения должен принять подход.
  • Служба размещения или сервер могут предоставить CSP через Content-Security-Policy заголовок , добавив исходящие ответы приложения. Так как этот подход зависит от размещения службы или сервера, он не рассматривается в следующих примерах. Если вы хотите применить этот подход, обратитесь к документации по поставщику услуг размещения или серверу.

Blazor Подходы к веб-приложению

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. Строка директивы — это значение заголовка.

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

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

Чтобы протестировать политику в течение определенного периода времени без применения директив политики, задайте для атрибутаhttp-equiv тега <meta> или заголовка политики на основе заголовков значение 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".

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