Sdílet prostřednictvím


Vynucení zásad zabezpečení obsahu pro ASP.NET Core Blazor

Poznámka:

Toto není nejnovější verze tohoto článku. Aktuální verzi najdete ve verzi .NET 8 tohoto článku.

Důležité

Tyto informace se týkají předběžného vydání produktu, který může být podstatně změněn před komerčním vydáním. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.

Aktuální verzi najdete ve verzi .NET 8 tohoto článku.

Tento článek vysvětluje, jak používat zásady zabezpečení obsahu (CSP) s aplikacemi ASP.NET Core Blazor k ochraně před útoky XSS (Cross-Site Scripting).

Skriptování mezi weby (XSS) je ohrožení zabezpečení, kdy útočník umístí jeden nebo více škodlivých skriptů na straně klienta do vykresleného obsahu aplikace. CSP pomáhá chránit před útoky XSS tím, že informuje prohlížeč o platném:

  • Zdroje pro načtený obsah, včetně skriptů, šablon stylů, obrázků a modulů plug-in.
  • Akce prováděné stránkou, které určují povolené cíle adres URL formulářů.

Pokud chcete použít CSP na aplikaci, vývojář určuje několik direktiv zabezpečení obsahu CSP v jedné nebo více Content-Security-Policy hlavičkách nebo <meta> značkách. Pokyny k použití CSP na aplikaci v kódu C# při spuštění najdete v tématu ASP.NET spuštění CoreBlazor.

Zásady se vyhodnocují prohlížečem při načítání stránky. Prohlížeč zkontroluje zdroje stránky a určí, jestli splňují požadavky direktiv zabezpečení obsahu. Pokud nejsou pro prostředek splněné direktivy zásad, prohlížeč prostředek nenačte. Představte si například zásadu, která nepovoluje skripty třetích stran. Pokud stránka obsahuje <script> značku s původem třetí strany v atributu src , prohlížeč zabrání načtení skriptu.

CSP je podporován ve většině moderních desktopových a mobilních prohlížečů, včetně Chromu, Edge, Firefoxu, Opery a Safari. CSP se doporučuje pro Blazor aplikace.

Direktivy zásad

Minimálně zadejte následující direktivy a zdroje pro Blazor aplikace. Podle potřeby přidejte další direktivy a zdroje. V části Použít zásadu tohoto článku se používají následující direktivy, kde jsou k dispozici například zásady zabezpečení pro Blazor aplikace:

  • base-uri: Omezuje adresy URL značky <base> stránky. Určete self , že původ aplikace, včetně schématu a čísla portu, je platným zdrojem.
  • default-src: Označuje záložní pro zdrojové direktivy, které nejsou explicitně určeny zásadou. Určete self , že původ aplikace, včetně schématu a čísla portu, je platným zdrojem.
  • img-src: Označuje platné zdroje pro obrázky.
    • Určete data: , že chcete povolit načítání obrázků z data: adres URL.
    • Zadejte https: , aby bylo možné načítat obrázky z koncových bodů HTTPS.
  • object-src: Označuje platné zdroje pro <object>, <embed>a <applet> značky. Zadejte none , aby se zabránilo všem zdrojům adres URL.
  • script-src: Označuje platné zdroje pro skripty.
    • Určete self , že původ aplikace, včetně schématu a čísla portu, je platným zdrojem.
    • V aplikaci na straně Blazor klienta:
      • Určete wasm-unsafe-eval , jestli má modul runtime Mono na straně Blazor klienta fungovat.
      • Zadejte všechny další hodnoty hash, které umožňují načtení požadovaných skriptů mimo architekturu .
    • V aplikaci na straně Blazor serveru zadejte hodnoty hash, které povolí načtení požadovaných skriptů.
  • style-src: Označuje platné zdroje pro šablony stylů.
    • Určete self , že původ aplikace, včetně schématu a čísla portu, je platným zdrojem.
    • Pokud aplikace používá vložené styly, zadejte unsafe-inline , aby bylo možné používat vložené styly.
  • upgrade-insecure-requests: Označuje, že adresy URL obsahu ze nezabezpečených zdrojů (HTTP) by se měly bezpečně získat přes HTTPS.
  • base-uri: Omezuje adresy URL značky <base> stránky. Určete self , že původ aplikace, včetně schématu a čísla portu, je platným zdrojem.
  • default-src: Označuje záložní pro zdrojové direktivy, které nejsou explicitně určeny zásadou. Určete self , že původ aplikace, včetně schématu a čísla portu, je platným zdrojem.
  • img-src: Označuje platné zdroje pro obrázky.
    • Určete data: , že chcete povolit načítání obrázků z data: adres URL.
    • Zadejte https: , aby bylo možné načítat obrázky z koncových bodů HTTPS.
  • object-src: Označuje platné zdroje pro <object>, <embed>a <applet> značky. Zadejte none , aby se zabránilo všem zdrojům adres URL.
  • script-src: Označuje platné zdroje pro skripty.
    • Určete self , že původ aplikace, včetně schématu a čísla portu, je platným zdrojem.
    • V aplikaci na straně Blazor klienta:
      • Určete unsafe-eval , jestli má modul runtime Mono na straně Blazor klienta fungovat.
      • Zadejte všechny další hodnoty hash, které umožňují načtení požadovaných skriptů mimo architekturu .
    • V aplikaci na straně Blazor serveru zadejte hodnoty hash, které povolí načtení požadovaných skriptů.
  • style-src: Označuje platné zdroje pro šablony stylů.
    • Určete self , že původ aplikace, včetně schématu a čísla portu, je platným zdrojem.
    • Pokud aplikace používá vložené styly, zadejte unsafe-inline , aby bylo možné používat vložené styly.
  • upgrade-insecure-requests: Označuje, že adresy URL obsahu ze nezabezpečených zdrojů (HTTP) by se měly bezpečně získat přes HTTPS.
  • base-uri: Omezuje adresy URL značky <base> stránky. Určete self , že původ aplikace, včetně schématu a čísla portu, je platným zdrojem.
  • default-src: Označuje záložní pro zdrojové direktivy, které nejsou explicitně určeny zásadou. Určete self , že původ aplikace, včetně schématu a čísla portu, je platným zdrojem.
  • img-src: Označuje platné zdroje pro obrázky.
    • Určete data: , že chcete povolit načítání obrázků z data: adres URL.
    • Zadejte https: , aby bylo možné načítat obrázky z koncových bodů HTTPS.
  • object-src: Označuje platné zdroje pro <object>, <embed>a <applet> značky. Zadejte none , aby se zabránilo všem zdrojům adres URL.
  • script-src: Označuje platné zdroje pro skripty.
    • https://stackpath.bootstrapcdn.com/ Zadejte zdroj hostitele pro skripty Bootstrap.
    • Určete self , že původ aplikace, včetně schématu a čísla portu, je platným zdrojem.
    • V aplikaci na straně Blazor klienta:
      • Určete unsafe-eval , jestli má modul runtime Mono na straně Blazor klienta fungovat.
      • Zadejte všechny další hodnoty hash, které umožňují načtení požadovaných skriptů mimo architekturu .
    • V aplikaci na straně Blazor serveru zadejte hodnoty hash, které povolí načtení požadovaných skriptů.
  • style-src: Označuje platné zdroje pro šablony stylů.
    • https://stackpath.bootstrapcdn.com/ Zadejte zdroj hostitele pro šablony stylů Bootstrap.
    • Určete self , že původ aplikace, včetně schématu a čísla portu, je platným zdrojem.
    • Zadejte unsafe-inline , aby bylo možné používat vložené styly.
  • upgrade-insecure-requests: Označuje, že adresy URL obsahu ze nezabezpečených zdrojů (HTTP) by se měly bezpečně získat přes HTTPS.
  • base-uri: Omezuje adresy URL značky <base> stránky. Určete self , že původ aplikace, včetně schématu a čísla portu, je platným zdrojem.
  • default-src: Označuje záložní pro zdrojové direktivy, které nejsou explicitně určeny zásadou. Určete self , že původ aplikace, včetně schématu a čísla portu, je platným zdrojem.
  • img-src: Označuje platné zdroje pro obrázky.
    • Určete data: , že chcete povolit načítání obrázků z data: adres URL.
    • Zadejte https: , aby bylo možné načítat obrázky z koncových bodů HTTPS.
  • object-src: Označuje platné zdroje pro <object>, <embed>a <applet> značky. Zadejte none , aby se zabránilo všem zdrojům adres URL.
  • script-src: Označuje platné zdroje pro skripty.
    • https://stackpath.bootstrapcdn.com/ Zadejte zdroj hostitele pro skripty Bootstrap.
    • Určete self , že původ aplikace, včetně schématu a čísla portu, je platným zdrojem.
    • V aplikaci na straně Blazor klienta:
      • Zadejte hodnoty hash, které povolí načtení požadovaných skriptů.
      • Zadejte unsafe-eval použití eval() a metody pro vytváření kódu z řetězců.
    • V aplikaci na straně Blazor serveru zadejte hodnoty hash, které povolí načtení požadovaných skriptů.
  • style-src: Označuje platné zdroje pro šablony stylů.
    • https://stackpath.bootstrapcdn.com/ Zadejte zdroj hostitele pro šablony stylů Bootstrap.
    • Určete self , že původ aplikace, včetně schématu a čísla portu, je platným zdrojem.
    • Zadejte unsafe-inline , aby bylo možné používat vložené styly. Vložená deklarace je vyžadována pro uživatelské rozhraní pro opětovné připojení klienta a serveru po počátečním požadavku. V budoucí verzi může být vložený styl odebrán, takže unsafe-inline už není potřeba.
  • upgrade-insecure-requests: Označuje, že adresy URL obsahu ze nezabezpečených zdrojů (HTTP) by se měly bezpečně získat přes HTTPS.

Předchozí direktivy jsou podporovány všemi prohlížeči kromě aplikace Microsoft Internet Explorer.

Získání hodnot hash SHA pro další vložené skripty:

  • Použijte CSP uvedený v části Použít zásadu .
  • Při místním spuštění aplikace přejděte ke konzole vývojářských nástrojů prohlížeče. Prohlížeč vypočítá a zobrazí hodnoty hash blokovaných skriptů, když je k dispozici hlavička nebo meta značka CSP.
  • Zkopírujte hodnoty hash poskytnuté prohlížečem script-src do zdrojů. Kolem každé hodnoty hash používejte jednoduché uvozovky.

Informace o matici podpory zásad zabezpečení obsahu 2 najdete v tématu Můžu použít: Zásady zabezpečení obsahu úrovně 2.

Použití zásad

<meta> Použití zásady pomocí značky:

  • Nastavte hodnotu atributu http-equiv na Content-Security-Policy.
  • Direktivy umístěte do hodnoty atributu content . Direktivy oddělte středníkem (;).
  • Vždy umístěte meta značku do <head> obsahu.

Následující části ukazují ukázkové zásady. Tyto příklady jsou verze s tímto článkem pro každou verzi Blazor. Pokud chcete použít verzi, která je vhodná pro vaši verzi, vyberte verzi dokumentu s rozevíracím seznamem Verze na této webové stránce.

Serverové Blazor aplikace

<head> V obsahu použijte direktivy popsané v části Direktivy Policy:

<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;">

Podle potřeby aplikace přidejte další script-src hodnoty hash a style-src hodnoty hash. Během vývoje použijte online nástroj nebo vývojářské nástroje prohlížeče k výpočtu hodnot hash za vás. Například následující konzola nástrojů prohlížeče hlásí hodnotu hash požadovaného skriptu, který zásady nepokrýval:

Odmítl spustit vložený skript, protože porušuje následující direktivu Content Security Policy: " ... ". K povolení vloženého spuštění je nutné buď klíčové slovo "unsafe-inline", hash ('sha256-v8v3RKRPmN4odZ1CWM5gw80QKPCCWMcpNeOmimNL2AA=' nebo nonce ('nonce-...').

Konkrétní skript přidružený k chybě se zobrazí v konzole vedle chyby.

Blazor Klientské aplikace

<head> V obsahu použijte direktivy popsané v části Direktivy Policy:

<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;">

Poznámka:

Hodnota sha256-v8v3RKRPmN4odZ1CWM5gw80QKPCCWMcpNeOmimNL2AA= hash představuje vložený skript, který se používá pro aplikace na straně Blazor klienta. To může být v budoucnu odebráno.

<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;">

Podle potřeby aplikace přidejte další script-src hodnoty hash a style-src hodnoty hash. Během vývoje použijte online nástroj nebo vývojářské nástroje prohlížeče k výpočtu hodnot hash za vás. Například následující konzola nástrojů prohlížeče hlásí hodnotu hash požadovaného skriptu, který zásady nepokrýval:

Odmítl spustit vložený skript, protože porušuje následující direktivu Content Security Policy: " ... ". K povolení vloženého spuštění je nutné buď klíčové slovo "unsafe-inline", hash ('sha256-v8v3RKRPmN4odZ1CWM5gw80QKPCCWMcpNeOmimNL2AA=' nebo nonce ('nonce-...').

Konkrétní skript přidružený k chybě se zobrazí v konzole vedle chyby.

Použití CSP v jiných prostředíchDevelopment

Když se na obsah aplikace <head> použije Blazor CSP, koliduje s místním testováním v Development prostředí. Například odkaz na prohlížeč a skript aktualizace prohlížeče se nenačte. Následující příklady ukazují, jak použít značku CSP <meta> v jiných prostředíchDevelopment .

Poznámka:

Příklady v této části nezobrazují úplnou <meta> značku poskytovatelů CSP. Kompletní <meta> značky najdete v pododdílech části Použít zásadu dříve v tomto článku.

K dispozici jsou tři obecné přístupy:

  • Použijte CSP prostřednictvím App komponenty, která použije CSP pro všechna rozložení aplikace.
  • Pokud potřebujete poskytovatele CSP použít pro různé oblasti aplikace, například vlastní CSP pouze pro stránky pro správu, použijte poskytovatele CSP na základě jednotlivých rozložení pomocí značky<HeadContent>. Pro úplnou efektivitu musí každý soubor rozložení aplikace přijmout přístup.
  • Hostitelská služba nebo server může prostřednictvím hlavičky Content-Security-Policy přidat odchozí odpovědi aplikace. Vzhledem k tomu, že se tento přístup liší podle hostitelské služby nebo serveru, není vyřešený v následujících příkladech. Pokud chcete tento přístup přijmout, projděte si dokumentaci k poskytovateli hostingových služeb nebo serveru.

Blazor Přístupy k webové aplikaci

In the App component (Components/App.razor), injektáž IHostEnvironment:

@inject IHostEnvironment Env

App V obsahu komponenty <head> použijte CSP, pokud není v Development prostředí:

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

Případně můžete použít poskytovatele CSP na základě rozložení ve Components/Layout složce, jak ukazuje následující příklad. Ujistěte se, že každé rozložení určuje CSP.

@inject IHostEnvironment Env

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

Blazor WebAssembly přístupy k aplikacím

In the App component (App.razor), injektáž IWebAssemblyHostEnvironment:

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

App V obsahu komponenty <head> použijte CSP, pokud není v Development prostředí:

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

Případně použijte předchozí kód, ale pro každé rozložení ve Layout složce použijte poskytovatele CSP. Ujistěte se, že každé rozložení určuje CSP.

Omezení metaznak

<meta> Zásady značek nepodporují následující direktivy:

Chcete-li podporovat předchozí direktivy, použijte hlavičku s názvem Content-Security-Policy. Řetězec direktivy je hodnota hlavičky.

Otestování zásad a příjem zpráv o porušeních předpisů

Testování pomáhá ověřit, že skripty třetích stran nejsou neúmyslně blokované při vytváření počátečních zásad.

Chcete-li otestovat zásadu v určitém časovém období bez vynucení direktiv zásad, nastavte <meta> atribut značky http-equiv nebo název hlavičky zásady založené na hlavičce na Content-Security-Policy-Report-Onlyhodnotu . Zprávy o chybách se odesílají jako JSdokumenty ON na zadanou adresu URL. Další informace najdete ve webové dokumentaci MDN: Content-Security-Policy-Report-Only.

Informace o porušeních v době, kdy je zásada aktivní, najdete v následujících článcích:

I když report-uri se už nedoporučuje používat, měly by se používat obě direktivy, dokud report-to nebudou podporovány všemi hlavními prohlížeči. Nepoužívejte výhradněreport-uri, protože podpora pro report-uri ně může být kdykoli ukončena z prohlížečů. Pokud je podpora plně podporovaná, odeberte v zásadách report-to podporureport-uri. Pokud chcete sledovat přijetí report-to, podívejte se, jak je možné použít: report-to.

Otestujte a aktualizujte zásady aplikace při každé vydané verzi.

Odstraňování potíží

  • Chyby se zobrazí v konzole vývojářských nástrojů prohlížeče. Prohlížeče poskytují informace o:
    • Prvky, které nevyhovují zásadám.
    • Jak upravit zásadu tak, aby umožňovala blokovanou položku.
  • Zásady jsou platné pouze v případech, kdy prohlížeč klienta podporuje všechny zahrnuté direktivy. Aktuální matici podpory prohlížeče najdete v tématu Je možné použít: Content-Security-Policy.

Další materiály