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 10 tohoto článku.

Upozorňující

Tato verze ASP.NET Core se už nepodporuje. Další informace najdete v zásadách podpory .NET a .NET Core. Aktuální verzi najdete v tomto článku ve verzi .NET 9.

Tento článek vysvětluje, jak používat zásady zabezpečení obsahu (CSP) s aplikacemi ASP.NET Core Blazor , které pomáhají chránit před určitými typy škodlivých útoků, jako jsou skriptování mezi weby (XSS) a útoky clickjacking . XSS je ohrožení zabezpečení, kdy cyberattacker umístí jeden nebo více škodlivých skriptů na straně klienta do vykresleného obsahu aplikace. Při útoku typu clickjacking je uživatel podveden k interakci s nastrčeným webem, který má vaši aplikaci vloženou do sebe.

Zásady CSP pomáhají chránit před těmito typy útoků tím, že informují prohlížeč o platné:

  • 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ářů.
  • Když je možné aplikaci vložit do jiného webu prostřednictvím <frame>, <iframe>, <object>nebo <embed> značek.

Doporučujeme přečíst následující zdroje MDN při implementaci CSP.

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 části ASP.NET Core startup Blazor a v sekci direktiva frame-ancestors dále v tomto článku.

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.

Upozorňující

Implementace CSP minimalizuje riziko určitých typů bezpečnostních hrozeb a nezaručuje, že je aplikace zcela bezpečná před útoky XSS a clickjacking. Uživatelskí agenti, obvykle prohlížeče, můžou uživatelům umožnit upravovat nebo obcházet vynucení zásad prostřednictvím uživatelských předvoleb, záložek, rozšíření prohlížeče, doplňků třetích stran uživatelského agenta a dalších takových mechanismů. Poskytovatelé cloudových služeb se také zaměřují pouze na nápravu podmnožiny útoků, a ne na všechny útoky, které mohou ohrozit zabezpečení, jako jsou injektáž SQL, útok CSRF (Cross-Site Request Forgery), chybná konfigurace zabezpečení a útoky DoS (Denial-of-Service).

Direktivy zásad

Pro Blazor aplikace se běžně používají následující direktivy a zdroje. 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 pro značku <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 náhradní postup pro zdrojové direktivy, které nejsou explicitně specifikovány 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 obrázků.
    • 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 značky <object>, <embed>a <applet>. 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 . Zadejte například unsafe-hashes s hashem sha256-qnHnQs7NjQNHHNYv/I9cW+I62HzDJjbnyS/OFzqlix0=, aby povolil vložený JavaScript pro přepínač navigace v komponentě NavMenu.
    • 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.
  • connect-src: Omezuje adresy URL, které lze načíst pomocí rozhraní skriptů. Jsou zadány zdroje http:schématu , ws: (Protokol WebSocket) a wss: (Protokol Secure WebSocket).
  • 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 pro značku <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 náhradní postup pro zdrojové direktivy, které nejsou explicitně specifikovány 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 obrázků.
    • 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 značky <object>, <embed>a <applet>. 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.
  • connect-src: Omezuje adresy URL, které lze načíst pomocí rozhraní skriptů. Jsou zadány zdroje http:schématu , ws: (Protokol WebSocket) a wss: (Protokol Secure WebSocket).
  • 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 pro značku <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 náhradní postup pro zdrojové direktivy, které nejsou explicitně specifikovány 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 obrázků.
    • 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 značky <object>, <embed>a <applet>. 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.
  • connect-src: Omezuje adresy URL, které lze načíst pomocí rozhraní skriptů. Jsou zadány zdroje http:schématu , ws: (Protokol WebSocket) a wss: (Protokol Secure WebSocket).
  • 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 pro značku <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 náhradní postup pro zdrojové direktivy, které nejsou explicitně specifikovány 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 obrázků.
    • 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 značky <object>, <embed>a <applet>. 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.
  • connect-src: Omezuje adresy URL, které lze načíst pomocí rozhraní skriptů. Jsou zadány zdroje http:schématu , ws: (Protokol WebSocket) a wss: (Protokol Secure WebSocket).
  • 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

CSP můžete použít prostřednictvím:

Chcete-li použít zásadu pomocí značky <meta>:

  • Nastavte hodnotu atributu http-equiv na Content-Security-Policy.
  • Direktivy umístěte do hodnoty atributu content . Direktivy oddělte středníkem (;). Koncový středník poslední direktivy řetězce zásad není vyžadován podle specifikace Content Security Policy Level 3.
  • Umístěte značku <meta> do obsahu <head> přímo za úvodní <head> značku. Zásada se vyhodnocuje a vynucuje při analýze kódu CSP, takže by se zásada měla objevit v horní části <head> kódu, aby se zajistilo, že se vynucuje na všech <script> značkách a <link> značkách.

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.

Direktiva frame-ancestors

Direktiva frame-ancestors určuje platné nadřazené prvky, které mohou zahrnout stránku se značkou <frame>, <iframe>, <object> nebo <embed>. frame-ancestors Direktivu nelze použít prostřednictvím CSP založeného na značkách<meta>. Směrnice musí být aplikována hlavičkou odpovědi. Hlavičku odpovědi CSP může přidat hostitel serveru nebo kód C# aplikace může přidat nebo aktualizovat CSP pomocí direktivy frame-ancestors .

Blazor Web Apps (.NET 8 nebo novější) automaticky obsahují hlavičku odpovědi, která nastaví hodnotu na 'self':

Content-Security-Policy: frame-ancestors 'self'

Pokud chcete změnit výchozí možnost na přísnější 'none' a zabránit všem nadřazeným prvkům v vložení aplikace, nastavte možnost ContentSecurityFrameAncestorsPolicy ve volání AddInteractiveServerRenderMode v souboru Program. Následující příkaz se projeví jenom v případě, že je povolená komprese WebSocket (ConfigureWebSocketAcceptContext je nastavená, což je výchozí hodnota pro Blazor aplikace).

.AddInteractiveServerRenderMode(o => o.ContentSecurityFrameAncestorsPolicy = "'none'")

V Blazor Server aplikacích se do kolekce hlaviček odpovědí nepřidá výchozí frame-ancestors direktiva. Hlavičku CSP můžete přidat ručně pomocí middlewaru v kanálu zpracování požadavků:

app.Use(async (context, next) =>
{
    context.Response.Headers.Add("Content-Security-Policy", "frame-ancestors 'none'");
    await next();
});

Upozorňující

Vyhněte se nastavení hodnoty direktivy frame-ancestors na 'null', když je povolená komprese WebSocket (komprese je výchozí), protože aplikace je zranitelná vůči útokům škodlivých skriptů a útokům typu clickjacking.

Další informace najdete v tématu CSP: frame-ancestors (dokumentace k MDN).

Serverové Blazor aplikace

Následující příklad je výchozím bodem pro další vývoj. V horní části <head> obsahu použijte direktivy popsané v části Direktivy Policy spolu s dalšími direktivami, které vaše specifikace aplikace vyžaduje.

Pro Blazor Web App nebo Blazor Server aplikace:

<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' 'unsafe-hashes' 
        'sha256-qnHnQs7NjQNHHNYv/I9cW+I62HzDJjbnyS/OFzqlix0=';
    style-src https:;
    connect-src 'self' http: ws: wss:;
    upgrade-insecure-requests;" />

Blazor Web Appzahrnuje vloženou onclick obslužnou rutinu události JavaScriptu NavMenu v komponentě, která vyžaduje jednu z následujících změn:

  • Přidejte do direktivy script-src hodnotu hash s klíčovým slovem unsafe-hashes :

    'unsafe-hashes' 'sha256-qnHnQs7NjQNHHNYv/I9cW+I62HzDJjbnyS/OFzqlix0='
    

    Další informace najdete v tématu CSP: script-src: Nezabezpečené vložené skripty (dokumentace k MDN).

  • Přesuňte vloženou obslužnou rutinu události JavaScriptu do souboru nebo modulu JavaScript, který má povolení k načítání dle zásad.

Blazor Web Apps také mají komponentu ImportMap v obsahu <head>, která vykresluje značku inline mapy importu <script>. Pokud chcete upravit zásadu tak, aby se načetla mapa importu, přečtěte si část Řešení porušení CSP s integritou subresource (SRI) nebo kryptografickým nonce.

Pro Blazor Server aplikace:

<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';
    connect-src 'self' http: ws: wss:;
    upgrade-insecure-requests">

Pro Blazor Server aplikace:

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

Pro Blazor Server aplikace:

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

Poznámka:

Předchozí hodnota hash SHA256 je určená pro demonstrační účely. Možná budete muset vypočítat novou hodnotu hash pro váš CSP.

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.

Pokyny k použití CSP na aplikaci v kódu C# při spuštění najdete v tématu Blazor Core.

Blazor Klientské aplikace

Následující příklad je výchozím bodem pro další vývoj. <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';
    connect-src 'none';
    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';
    connect-src 'none';
    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' 
        'sha256-v8v3RKRPmN4odZ1CWM5gw80QKPCCWMcpNeOmimNL2AA=';
    style-src 'self';
    connect-src 'none';
    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 'self' 'unsafe-eval' https://stackpath.bootstrapcdn.com/ 
        'sha256-v8v3RKRPmN4odZ1CWM5gw80QKPCCWMcpNeOmimNL2AA=';
    style-src 'self' 'unsafe-inline' https://stackpath.bootstrapcdn.com/;
    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' https://stackpath.bootstrapcdn.com/ 
        'sha256-v8ZC9OgMhcnEQ/Me77/R9TlJfzOBqrMTW8e1KuqLaqc=' 
        'sha256-If//FtbPc03afjLezvWHnC3Nbu4fDM04IIzkPaf3pH0=' 
        'sha256-v8v3RKRPmN4odZ1CWM5gw80QKPCCWMcpNeOmimNL2AA=';
    style-src 'self' 'unsafe-inline' https://stackpath.bootstrapcdn.com/;
    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.

Řešení porušení CSP s využitím integrity subresource (SRI) nebo kryptografické nonce

Dva přístupy k řešení porušení CSP, které jsou popsány v následujících dvou částech, jsou:

Přijetí integrity podresursů (SRI)

Subresource Integrity (SRI) umožňuje prohlížečům ověřit, že prostředky nejsou během přenosu pozměněny. Kryptografická hodnota hash zadaná v prostředku musí odpovídat hodnotě hash vypočítané prohlížečem pro načtený prostředek a hodnotu hash uvedenou v poskytovateli CSP. Kompatibilitu prohlížeče lze vyhodnotit na Can I use? Subresource Integrity.

V následujícím příkladu Blazor Server aplikace se integrita vypočítá pomocí nástroje třetí strany a je specifikována pro Blazor skript (blazor.server.js) a CSP. Skript Blazor se v tomto scénáři dynamicky nemění a má stabilní hodnotu hash SHA, takže můžete pevně zakódovat hodnotu atributu integrity .

Upozorňující

crossorigin Nastavte atribut na podsourcu, který je načten z jiného původu bez sdílení prostředků mezi zdroji (CORS). Pokud se zdroj aplikace liší od místa, kde se načte podsložka, je vyžadována hlavička Access-Control-Allow-Origin, která umožňuje sdílení prostředku s žádajícím původem jinak, atribut crossorigin se musí použít na značku podsložky v aplikaci. V opačném případě prohlížeč přijme zásadu "fail-open" pro podsourc, což znamená, že se podsourc načte bez kontroly jeho integrity.

Atribut crossorigin není přidán do značky Blazor<script> v následujícím příkladu, protože skript Blazor je načten ze zdroje aplikace.

Další informace najdete v tématu Sdílení prostředků mezi zdroji a integrita podsourců (dokumentace k MDN).

<!DOCTYPE html>
<html lang="en">
<head>
    <meta http-equiv="Content-Security-Policy" content="
        base-uri 'self';
        default-src 'self';
        img-src data: https:;
        object-src 'none';
        script-src 'sha256-FyuamsHhg0nWZUnu/f5qrt2DlL1XKt5AX+cgRhtxtfg=';
        style-src https:;
        connect-src 'self' http: ws: wss:;
        upgrade-insecure-requests;" />
    ...
</head>
<body>
    ...
    <script src="_framework/blazor.server.js" 
        integrity="sha256-FyuamsHhg0nWZUnu/f5qrt2DlL1XKt5AX+cgRhtxtfg="></script>
</body>
</html>

V následujícím příkladu Blazor Web App pro (.NET 8 nebo novější) se vypočítá integrita pro komponentu ImportMap (.NET 9 nebo novější). Hodnota ImportMap integrity se vypočítá pro každý požadavek aplikace, protože ImportMap komponenta vykresluje jedinečný obsah pokaždé, když se stránka vygeneruje pro otisky prstů.

Vykreslené mapování importu ImportMap z komponenty je vytvořen aplikací u jejího původu, takže crossorigin atribut není součástí značky ImportMap. Další informace najdete v průvodci MDN CSP: Hodnoty hash a integrita subresource (dokumentace k MDN)

@using System.Security.Cryptography
<!DOCTYPE html>
<html lang="en">
<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' 'unsafe-hashes' '@integrity'
            'sha256-qnHnQs7NjQNHHNYv/I9cW+I62HzDJjbnyS/OFzqlix0=';
        style-src https:;
        connect-src 'self' http: ws: wss:;
        upgrade-insecure-requests;" />
    ...
    <ImportMap integrity="@integrity" />
    ...
</head>
...
</html>

@code {
    private string? integrity;

    [CascadingParameter]
    private HttpContext? HttpContext { get; set; }

    protected override void OnInitialized()
    {
        var metadata = HttpContext?.GetEndpoint()?.Metadata
            .GetOrderedMetadata<ImportMapDefinition>();
        var utf8 = new System.Text.UTF8Encoding();
        var metadataBytes = utf8.GetBytes(
            metadata?.FirstOrDefault<ImportMapDefinition>()?.ToString()
                .ReplaceLineEndings("\n") ?? string.Empty);
        integrity = 
            $"sha256-{Convert.ToBase64String(SHA256.HashData(metadataBytes))}";
    }
}

Před .NET 6 použijte .Replace("\r\n", "\n") místo volání ReplaceLineEndings v předchozím kódu.

Poznámka:

Pokud musí být další atributy přidány do vykresleného prvku komponenty ImportMap, můžete předat slovník všech atributů komponentě <script> prostřednictvím její vlastnosti ImportMap. Dvojice integrity název-hodnota atributu se předává ve slovníku se zbývajícími předanými atributy.

Použití kryptografické náhodné číslo

Kryptografický nonce (číslo použité jednou) umožňuje prohlížečům ověřit, že během přenosu nejsou prostředky manipulovány. Jedenkrát použitelný kryptografický nonce uvedený v CSP se musí shodovat s nonce uvedeným na prostředku. Kompatibilitu prohlížeče lze posoudit na Can I use? Nonce.

V následujícím příkladu pro Blazor Web App (.NET 8 nebo novější) je pro komponentu ImportMap (.NET 9 nebo novější) vytvořen nonce s jedinečnou hodnotou při každém načtení aplikace.

Další informace najdete v příručce MDN CSP: Nonces a CSP: script-src: Nebezpečné vložené skripty (dokumentace k MDN).

@using System.Security.Cryptography
<!DOCTYPE html>
<html lang="en">
<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' 'unsafe-hashes' 'nonce-@nonce' 
            'sha256-qnHnQs7NjQNHHNYv/I9cW+I62HzDJjbnyS/OFzqlix0=';
        style-src https:;
        connect-src 'self' http: ws: wss:;
        upgrade-insecure-requests;" />
    ...
    <ImportMap nonce="@nonce" />
    ...
</head>
...
</html>

@code {
    private string? nonce;

    protected override void OnInitialized()
    {
        using (var rng = RandomNumberGenerator.Create())
        {
            var nonceBytes = new byte[32];
            rng.GetBytes(nonceBytes);
            nonce = Convert.ToBase64String(nonceBytes);
        }
    }
}

Poznámka:

Pokud musí být další atributy přidány do vykresleného prvku komponenty ImportMap, můžete předat slovník všech atributů komponentě <script> prostřednictvím její vlastnosti ImportMap. Dvojice nonce name-value se předává ve slovníku se zbývajícími předanými atributy.

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

Když se na obsah aplikace Blazor použije <head> 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 Web App přistupuje

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 . Sestavy selhání se posílají jako dokumenty JSON 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-uri podporureport-to. 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