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.
Upozorňující
Tato verze ASP.NET Core se už nepodporuje. Další informace najdete v tématu .NET a .NET Core Zásady podpory. 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 cyberattacker 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četeself
, ž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ů zdata:
adres URL. - Zadejte
https:
, aby bylo možné načítat obrázky z koncových bodů HTTPS.
- Určete
- object-src: Označuje platné zdroje pro
<object>
,<embed>
a<applet>
značky. Zadejtenone
, 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 .
- Určete
- V aplikaci na straně Blazor serveru zadejte hodnoty hash, které povolí načtení požadovaných skriptů.
- Určete
- 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.
- Určete
- 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četeself
, ž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ů zdata:
adres URL. - Zadejte
https:
, aby bylo možné načítat obrázky z koncových bodů HTTPS.
- Určete
- object-src: Označuje platné zdroje pro
<object>
,<embed>
a<applet>
značky. Zadejtenone
, 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 .
- Určete
- V aplikaci na straně Blazor serveru zadejte hodnoty hash, které povolí načtení požadovaných skriptů.
- Určete
- 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.
- Určete
- 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četeself
, ž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ů zdata:
adres URL. - Zadejte
https:
, aby bylo možné načítat obrázky z koncových bodů HTTPS.
- Určete
- object-src: Označuje platné zdroje pro
<object>
,<embed>
a<applet>
značky. Zadejtenone
, 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 .
- Určete
- 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četeself
, ž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ů zdata:
adres URL. - Zadejte
https:
, aby bylo možné načítat obrázky z koncových bodů HTTPS.
- Určete
- object-src: Označuje platné zdroje pro
<object>
,<embed>
a<applet>
značky. Zadejtenone
, 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žeunsafe-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
naContent-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;">
<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 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-Only
hodnotu . 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-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.