Wymuszanie zasad zabezpieczeń zawartości dla ASP.NET Core Blazor
Uwaga
Nie jest to najnowsza wersja tego artykułu. Aby zapoznać się z bieżącą wersją, zobacz wersję tego artykułu platformy .NET 9.
Ważne
Te informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany, zanim zostanie wydany komercyjnie. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Aby zapoznać się z bieżącą wersją, zobacz wersję tego artykułu platformy .NET 9.
W tym artykule wyjaśniono, jak używać zasad zabezpieczeń zawartości (CSP) z aplikacjami ASP.NET Core Blazor w celu ochrony przed atakami między witrynami (XSS).
Skrypty między witrynami (XSS) to luka w zabezpieczeniach, w której cyberataka umieszcza co najmniej jeden złośliwy skrypt po stronie klienta w renderowanej zawartości aplikacji. Dostawca usług kryptograficznych pomaga chronić przed atakami XSS, informując przeglądarkę o prawidłowym kodzie:
- Źródła załadowanych zawartości, w tym skrypty, arkusze stylów, obrazy i wtyczki.
- Akcje wykonywane przez stronę, określając dozwolone elementy docelowe adresów URL formularzy.
Aby zastosować dostawcę CSP do aplikacji, deweloper określa kilka dyrektyw zabezpieczeń zawartości CSP w co najmniej jednym Content-Security-Policy
nagłówku lub <meta>
tagach. Aby uzyskać wskazówki dotyczące stosowania dostawcy CSP do aplikacji w kodzie języka C# podczas uruchamiania, zobacz ASP.NET Core Blazor start.
Zasady są oceniane przez przeglądarkę podczas ładowania strony. Przeglądarka sprawdza źródła strony i określa, czy spełniają one wymagania dyrektyw zabezpieczeń zawartości. Gdy dyrektywy zasad nie są spełnione dla zasobu, przeglądarka nie ładuje zasobu. Rozważmy na przykład zasady, które nie zezwalają na skrypty innych firm. Gdy strona zawiera <script>
tag ze źródłem innej firmy w atrybucie src
, przeglądarka uniemożliwia ładowanie skryptu.
Program CSP jest obsługiwany w większości nowoczesnych przeglądarek klasycznych i mobilnych, w tym Chrome, Edge, Firefox, Opera i Safari. Dostawca CSP jest zalecany w przypadku Blazor aplikacji.
Dyrektywy zasad
Minimalnie określ następujące dyrektywy i źródła dla Blazor aplikacji. Dodaj dodatkowe dyrektywy i źródła zgodnie z potrzebami. Następujące dyrektywy są używane w sekcji Zastosuj zasady w tym artykule, gdzie podano przykładowe zasady zabezpieczeń dla Blazor aplikacji:
- base-uri: ogranicza adresy URL tagu
<base>
strony. Określself
, aby wskazać, że źródło aplikacji, w tym schemat i numer portu, jest prawidłowym źródłem. - default-src: wskazuje rezerwę dla dyrektyw źródłowych, które nie są jawnie określone przez zasady. Określ
self
, aby wskazać, że źródło aplikacji, w tym schemat i numer portu, jest prawidłowym źródłem. - img-src: Wskazuje prawidłowe źródła obrazów.
- Określ
data:
, aby zezwolić na ładowanie obrazów zdata:
adresów URL. - Określ
https:
, aby zezwolić na ładowanie obrazów z punktów końcowych HTTPS.
- Określ
- object-src: wskazuje prawidłowe źródła tagów
<object>
,<embed>
i<applet>
. Określ,none
aby zapobiec wszystkim źródłom adresów URL. - script-src: wskazuje prawidłowe źródła skryptów.
- Określ
self
, aby wskazać, że źródło aplikacji, w tym schemat i numer portu, jest prawidłowym źródłem. - W aplikacji po stronie Blazor klienta:
- Określ
wasm-unsafe-eval
, aby umożliwić działanie środowiska uruchomieniowego Mono po stronie Blazor klienta. - Określ wszelkie dodatkowe skróty, aby zezwolić na ładowanie wymaganych skryptów innych niż struktury.
- Określ
- W aplikacji po stronie Blazor serwera określ skróty, aby zezwolić na ładowanie wymaganych skryptów.
- Określ
- style-src: wskazuje prawidłowe źródła arkuszy stylów.
- Określ
self
, aby wskazać, że źródło aplikacji, w tym schemat i numer portu, jest prawidłowym źródłem. - Jeśli aplikacja używa stylów wbudowanych, określ
unsafe-inline
, aby zezwolić na używanie stylów wbudowanych.
- Określ
- upgrade-insecure-requests: wskazuje, że adresy URL zawartości ze źródeł niezabezpieczonych (HTTP) powinny być uzyskiwane bezpiecznie za pośrednictwem protokołu HTTPS.
- base-uri: ogranicza adresy URL tagu
<base>
strony. Określself
, aby wskazać, że źródło aplikacji, w tym schemat i numer portu, jest prawidłowym źródłem. - default-src: wskazuje rezerwę dla dyrektyw źródłowych, które nie są jawnie określone przez zasady. Określ
self
, aby wskazać, że źródło aplikacji, w tym schemat i numer portu, jest prawidłowym źródłem. - img-src: Wskazuje prawidłowe źródła obrazów.
- Określ
data:
, aby zezwolić na ładowanie obrazów zdata:
adresów URL. - Określ
https:
, aby zezwolić na ładowanie obrazów z punktów końcowych HTTPS.
- Określ
- object-src: wskazuje prawidłowe źródła tagów
<object>
,<embed>
i<applet>
. Określ,none
aby zapobiec wszystkim źródłom adresów URL. - script-src: wskazuje prawidłowe źródła skryptów.
- Określ
self
, aby wskazać, że źródło aplikacji, w tym schemat i numer portu, jest prawidłowym źródłem. - W aplikacji po stronie Blazor klienta:
- Określ
unsafe-eval
, aby umożliwić działanie środowiska uruchomieniowego Mono po stronie Blazor klienta. - Określ wszelkie dodatkowe skróty, aby zezwolić na ładowanie wymaganych skryptów innych niż struktury.
- Określ
- W aplikacji po stronie Blazor serwera określ skróty, aby zezwolić na ładowanie wymaganych skryptów.
- Określ
- style-src: wskazuje prawidłowe źródła arkuszy stylów.
- Określ
self
, aby wskazać, że źródło aplikacji, w tym schemat i numer portu, jest prawidłowym źródłem. - Jeśli aplikacja używa stylów wbudowanych, określ
unsafe-inline
, aby zezwolić na używanie stylów wbudowanych.
- Określ
- upgrade-insecure-requests: wskazuje, że adresy URL zawartości ze źródeł niezabezpieczonych (HTTP) powinny być uzyskiwane bezpiecznie za pośrednictwem protokołu HTTPS.
- base-uri: ogranicza adresy URL tagu
<base>
strony. Określself
, aby wskazać, że źródło aplikacji, w tym schemat i numer portu, jest prawidłowym źródłem. - default-src: wskazuje rezerwę dla dyrektyw źródłowych, które nie są jawnie określone przez zasady. Określ
self
, aby wskazać, że źródło aplikacji, w tym schemat i numer portu, jest prawidłowym źródłem. - img-src: Wskazuje prawidłowe źródła obrazów.
- Określ
data:
, aby zezwolić na ładowanie obrazów zdata:
adresów URL. - Określ
https:
, aby zezwolić na ładowanie obrazów z punktów końcowych HTTPS.
- Określ
- object-src: wskazuje prawidłowe źródła tagów
<object>
,<embed>
i<applet>
. Określ,none
aby zapobiec wszystkim źródłom adresów URL. - script-src: wskazuje prawidłowe źródła skryptów.
https://stackpath.bootstrapcdn.com/
Określ źródło hosta dla skryptów bootstrap.- Określ
self
, aby wskazać, że źródło aplikacji, w tym schemat i numer portu, jest prawidłowym źródłem. - W aplikacji po stronie Blazor klienta:
- Określ
unsafe-eval
, aby umożliwić działanie środowiska uruchomieniowego Mono po stronie Blazor klienta. - Określ wszelkie dodatkowe skróty, aby zezwolić na ładowanie wymaganych skryptów innych niż struktury.
- Określ
- W aplikacji po stronie Blazor serwera określ skróty, aby zezwolić na ładowanie wymaganych skryptów.
- style-src: wskazuje prawidłowe źródła arkuszy stylów.
https://stackpath.bootstrapcdn.com/
Określ źródło hosta dla arkuszy stylów Bootstrap.- Określ
self
, aby wskazać, że źródło aplikacji, w tym schemat i numer portu, jest prawidłowym źródłem. - Określ
unsafe-inline
, aby zezwolić na używanie stylów wbudowanych.
- upgrade-insecure-requests: wskazuje, że adresy URL zawartości ze źródeł niezabezpieczonych (HTTP) powinny być uzyskiwane bezpiecznie za pośrednictwem protokołu HTTPS.
- base-uri: ogranicza adresy URL tagu
<base>
strony. Określself
, aby wskazać, że źródło aplikacji, w tym schemat i numer portu, jest prawidłowym źródłem. - default-src: wskazuje rezerwę dla dyrektyw źródłowych, które nie są jawnie określone przez zasady. Określ
self
, aby wskazać, że źródło aplikacji, w tym schemat i numer portu, jest prawidłowym źródłem. - img-src: Wskazuje prawidłowe źródła obrazów.
- Określ
data:
, aby zezwolić na ładowanie obrazów zdata:
adresów URL. - Określ
https:
, aby zezwolić na ładowanie obrazów z punktów końcowych HTTPS.
- Określ
- object-src: wskazuje prawidłowe źródła tagów
<object>
,<embed>
i<applet>
. Określ,none
aby zapobiec wszystkim źródłom adresów URL. - script-src: wskazuje prawidłowe źródła skryptów.
https://stackpath.bootstrapcdn.com/
Określ źródło hosta dla skryptów bootstrap.- Określ
self
, aby wskazać, że źródło aplikacji, w tym schemat i numer portu, jest prawidłowym źródłem. - W aplikacji po stronie Blazor klienta:
- Określ skróty, aby zezwolić na ładowanie wymaganych skryptów.
- Określ
unsafe-eval
, aby używaćeval()
metod i do tworzenia kodu na podstawie ciągów.
- W aplikacji po stronie Blazor serwera określ skróty, aby zezwolić na ładowanie wymaganych skryptów.
- style-src: wskazuje prawidłowe źródła arkuszy stylów.
https://stackpath.bootstrapcdn.com/
Określ źródło hosta dla arkuszy stylów Bootstrap.- Określ
self
, aby wskazać, że źródło aplikacji, w tym schemat i numer portu, jest prawidłowym źródłem. - Określ
unsafe-inline
, aby zezwolić na używanie stylów wbudowanych. Deklaracja śródliniowa jest wymagana dla interfejsu użytkownika w celu ponownego połączenia klienta i serwera po początkowym żądaniu. W przyszłej wersji style wbudowane mogą zostać usunięte, abyunsafe-inline
nie było już wymagane.
- upgrade-insecure-requests: wskazuje, że adresy URL zawartości ze źródeł niezabezpieczonych (HTTP) powinny być uzyskiwane bezpiecznie za pośrednictwem protokołu HTTPS.
Powyższe dyrektywy są obsługiwane przez wszystkie przeglądarki z wyjątkiem programu Microsoft Internet Explorer.
Aby uzyskać skróty SHA dla dodatkowych skryptów wbudowanych:
- Zastosuj dostawcę CSP pokazanego w sekcji Zastosuj zasady .
- Uzyskaj dostęp do konsoli narzędzi deweloperskich przeglądarki podczas lokalnego uruchamiania aplikacji. Przeglądarka oblicza i wyświetla skróty dla zablokowanych skryptów, gdy jest obecny nagłówek lub
meta
tag CSP. - Skopiuj skróty dostarczone przez przeglądarkę do
script-src
źródeł. Użyj pojedynczych cudzysłowów wokół każdego skrótu.
Aby zapoznać się z macierzą obsługi zasad zabezpieczeń zawartości na poziomie 2, zobacz Temat Czy mogę użyć: poziom zasad zabezpieczeń zawartości 2.
Stosowanie zasad
Użyj tagu <meta>
, aby zastosować zasady:
- Ustaw wartość atrybutu
http-equiv
naContent-Security-Policy
. - Umieść dyrektywy w wartości atrybutu
content
. Rozdziel dyrektywy średnikami (;
). - Zawsze umieszczaj
meta
tag w<head>
zawartości.
W poniższych sekcjach przedstawiono przykładowe zasady. Te przykłady są wersjonowane w tym artykule dla każdej wersji programu Blazor. Aby użyć wersji odpowiedniej dla wydania, wybierz wersję dokumentu z selektorem listy rozwijanej Wersja na tej stronie internetowej.
Aplikacje po stronie Blazor serwera
<head>
W zawartości zastosuj dyrektywy opisane w sekcji Dyrektywy zasad:
<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;">
Dodaj dodatkowe script-src
wartości i style-src
skróty zgodnie z wymaganiami aplikacji. Podczas programowania użyj narzędzia online lub narzędzi deweloperskich przeglądarki, aby obliczyć skróty. Na przykład następujący błąd konsoli narzędzi przeglądarki zgłasza skrót dla wymaganego skryptu, który nie jest objęty zasadami:
Odmówił wykonania skryptu wbudowanego, ponieważ narusza on następującą dyrektywę Zasad zabezpieczeń zawartości: " ... ". Słowo kluczowe "niebezpieczne w tekście", skrót ('sha256-v8v3RKRPmN4odZ1CWM5gw80QKPCCWMcpNeOmimNL2AA=') lub nonce ('nonce-...') jest wymagane do włączenia wykonywania wbudowanego.
Określony skrypt skojarzony z błędem jest wyświetlany w konsoli obok błędu.
Aplikacje po stronie Blazor klienta
<head>
W zawartości zastosuj dyrektywy opisane w sekcji Dyrektywy zasad:
<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;">
Dodaj dodatkowe script-src
wartości i style-src
skróty zgodnie z wymaganiami aplikacji. Podczas programowania użyj narzędzia online lub narzędzi deweloperskich przeglądarki, aby obliczyć skróty. Na przykład następujący błąd konsoli narzędzi przeglądarki zgłasza skrót dla wymaganego skryptu, który nie jest objęty zasadami:
Odmówił wykonania skryptu wbudowanego, ponieważ narusza on następującą dyrektywę Zasad zabezpieczeń zawartości: " ... ". Słowo kluczowe "niebezpieczne w tekście", skrót ('sha256-v8v3RKRPmN4odZ1CWM5gw80QKPCCWMcpNeOmimNL2AA=') lub nonce ('nonce-...') jest wymagane do włączenia wykonywania wbudowanego.
Określony skrypt skojarzony z błędem jest wyświetlany w konsoli obok błędu.
Stosowanie dostawcy CSP w środowiskach innych niżDevelopment
Gdy dostawca CSP jest stosowany do Blazor zawartości aplikacji <head>
, zakłóca lokalne testowanie w Development
środowisku. Na przykład nie można załadować linku przeglądarki i skryptu odświeżania przeglądarki. W poniższych przykładach pokazano, jak zastosować tag dostawcy <meta>
CSP w środowiskach innychDevelopment
niż.
Uwaga
Przykłady w tej sekcji nie pokazują pełnego <meta>
tagu dla dostawców CSP. Pełne <meta>
tagi znajdują się w podsekcjach sekcji Zastosuj zasady we wcześniejszej części tego artykułu.
Dostępne są trzy ogólne podejścia:
- Zastosuj dostawcę CSP za pośrednictwem
App
składnika, który stosuje dostawcę CSP do wszystkich układów aplikacji. - Jeśli musisz zastosować dostawców CSP do różnych obszarów aplikacji, na przykład niestandardowy dostawca CSP tylko dla stron administracyjnych, zastosuj dostawców CSP dla poszczególnych układów przy użyciu tagu
<HeadContent>
. Aby zapewnić pełną skuteczność, każdy plik układu aplikacji musi przyjąć podejście. - Usługa hostingu lub serwer może dostarczyć dostawcę usług kryptograficznych za pośrednictwem
Content-Security-Policy
nagłówka dodanego odpowiedzi wychodzących aplikacji. Ponieważ takie podejście różni się w zależności od usługi hostingu lub serwera, nie jest ono rozwiązane w poniższych przykładach. Jeśli chcesz zastosować to podejście, zapoznaj się z dokumentacją dostawcy usług hostingu lub serwera.
Blazor Web App Podejścia
W składniku App
(Components/App.razor
) wstrzyknąć :IHostEnvironment
@inject IHostEnvironment Env
App
W zawartości składnika <head>
zastosuj dostawcę CSP, gdy nie znajduje się Development
on w środowisku:
@if (!Env.IsDevelopment())
{
<meta ...>
}
Alternatywnie zastosuj dostawcy CSP dla poszczególnych układów w folderze Components/Layout
, jak pokazano w poniższym przykładzie. Upewnij się, że każdy układ określa dostawcę CSP.
@inject IHostEnvironment Env
@if (!Env.IsDevelopment())
{
<HeadContent>
<meta ...>
</HeadContent>
}
Blazor WebAssembly podejścia do aplikacji
W składniku App
(App.razor
) wstrzyknąć :IWebAssemblyHostEnvironment
@using Microsoft.AspNetCore.Components.WebAssembly.Hosting
@inject IWebAssemblyHostEnvironment Env
App
W zawartości składnika <head>
zastosuj dostawcę CSP, gdy nie znajduje się Development
on w środowisku:
@if (!Env.IsDevelopment())
{
<HeadContent>
<meta ...>
</HeadContent>
}
Alternatywnie użyj poprzedniego kodu, ale zastosuj dostawcy CSP dla poszczególnych układów w folderze Layout
. Upewnij się, że każdy układ określa dostawcę CSP.
Ograniczenia tagów metadanych
Zasady <meta>
tagów nie obsługują następujących dyrektyw:
Aby obsługiwać powyższe dyrektywy, użyj nagłówka o nazwie Content-Security-Policy
. Ciąg dyrektywy jest wartością nagłówka.
Testowanie zasad i odbieranie raportów o naruszeniach
Testowanie pomaga potwierdzić, że skrypty innych firm nie są przypadkowo blokowane podczas tworzenia zasad początkowych.
Aby przetestować zasady w danym okresie bez wymuszania dyrektyw zasad, ustaw <meta>
atrybut tagu http-equiv
lub nazwę nagłówka zasad opartych na nagłówku na Content-Security-Policy-Report-Only
wartość . Raporty o błędach są wysyłane jako dokumenty JSON do określonego adresu URL. Aby uzyskać więcej informacji, zobacz Dokumentacja sieci Web USŁUGI MDN: Content-Security-Policy-Report-Only.
Aby uzyskać informacje na temat raportowania naruszeń, gdy zasady są aktywne, zobacz następujące artykuły:
Chociaż report-uri
nie jest już zalecane do użycia, obie dyrektywy powinny być używane do czasu report-to
obsługi przez wszystkie główne przeglądarki. Nie należy używać wyłącznie, report-uri
ponieważ obsługa report-uri
usługi jest objęta usunięciem w dowolnym momencie z przeglądarek. Usuń obsługę report-uri
funkcji w zasadach, gdy report-to
jest w pełni obsługiwana. Aby śledzić wdrażanie programu report-to
, zobacz Temat Czy mogę użyć polecenia: report-to.
Testowanie i aktualizowanie zasad aplikacji w każdej wersji.
Rozwiązywanie problemów
- Błędy są wyświetlane w konsoli narzędzi deweloperskich przeglądarki. Przeglądarki zawierają informacje o:
- Elementy, które nie są zgodne z zasadami.
- Jak zmodyfikować zasady, aby zezwolić na zablokowany element.
- Zasady są całkowicie skuteczne tylko wtedy, gdy przeglądarka klienta obsługuje wszystkie dołączone dyrektywy. Aby zapoznać się z bieżącą macierzą obsługi przeglądarki, zobacz Temat Czy mogę użyć: Content-Security-Policy.