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ą, zapoznaj się z wersją tego artykułu platformy .NET 8.

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ą, zapoznaj się z wersją tego artykułu platformy .NET 8.

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 osoba atakująca umieszcza co najmniej jeden złośliwy skrypt po stronie klienta w renderowaną zawartość 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śl self , 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 z data: adresów URL.
    • Określ https: , aby zezwolić na ładowanie obrazów z punktów końcowych HTTPS.
  • 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.
    • 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.
    • 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.
  • 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śl self , 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 z data: adresów URL.
    • Określ https: , aby zezwolić na ładowanie obrazów z punktów końcowych HTTPS.
  • 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.
    • 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.
    • 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.
  • 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śl self , 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 z data: adresów URL.
    • Określ https: , aby zezwolić na ładowanie obrazów z punktów końcowych HTTPS.
  • 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.
    • 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śl self , 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 z data: adresów URL.
    • Określ https: , aby zezwolić na ładowanie obrazów z punktów końcowych HTTPS.
  • 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, aby unsafe-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 na Content-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;">

Uwaga

Skrót sha256-v8v3RKRPmN4odZ1CWM5gw80QKPCCWMcpNeOmimNL2AA= reprezentuje wbudowany skrypt używany w aplikacjach po stronie Blazor klienta. Może to zostać usunięte w przyszłości.

<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 Podejścia do aplikacji internetowej

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-Onlywartość . Raporty o błędach są wysyłane jako JSdokumenty WŁ. 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.

Dodatkowe zasoby