Wymuszanie zasad zabezpieczeń zawartości dla ASP.NET Core Blazor

Uwaga

Nie jest to najnowsza wersja tego artykułu. Aby przełączyć się do najnowszej wersji, użyj selektora wersji ASP.NET Core w górnej części spisu treści.

Selektor wersji

Jeśli selektor nie jest widoczny w wąskim oknie przeglądarki, poszerz okno lub wybierz pionowy wielokropek () >Spis treści.

Selektor spisu treści

W tym artykule wyjaśniono, jak używać zasad zabezpieczeń zawartości (CSP) z aplikacjami ASP.NET CoreBlazor, aby chronić się przed atakami skryptów 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 renderowanej zawartości aplikacji. Dostawca CSP pomaga chronić przed atakami XSS, informując przeglądarkę o prawidłowym:

  • Ź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 dostawcy 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 uruchamiania.

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 src atrybucie, przeglądarka uniemożliwia ładowanie skryptu.

Dostawca 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. Poniższe dyrektywy są używane w sekcji Zastosuj zasady w tym artykule, gdzie podano przykładowe zasady zabezpieczeń i Blazor WebAssemblyBlazor Server są dostępne:

  • base-uri: ogranicza adresy URL tagu <base> strony. Określ, aby wskazać self , ż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, aby wskazać self , ż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, aby wskazać self , że źródło aplikacji, w tym schemat i numer portu, jest prawidłowym źródłem.
    • Blazor WebAssembly W aplikacji:
      • Określ wasm-unsafe-eval , aby umożliwić działanie środowiska uruchomieniowego Blazor WebAssembly Mono.
      • Określ wszelkie dodatkowe skróty, aby zezwolić na ładowanie wymaganych skryptów innych niż struktury .
    • Blazor Server W aplikacji określ skróty, aby zezwolić na ładowanie wymaganych skryptów.
  • style-src: wskazuje prawidłowe źródła arkuszy stylów.
    • Określ, aby wskazać self , ż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 z niezabezpieczonych źródeł (HTTP) powinny być bezpiecznie uzyskiwane za pośrednictwem protokołu HTTPS.
  • base-uri: ogranicza adresy URL tagu <base> strony. Określ, aby wskazać self , ż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, aby wskazać self , ż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, aby wskazać self , że źródło aplikacji, w tym schemat i numer portu, jest prawidłowym źródłem.
    • Blazor WebAssembly W aplikacji:
      • Określ unsafe-eval , aby umożliwić działanie środowiska uruchomieniowego Blazor WebAssembly Mono.
      • Określ wszelkie dodatkowe skróty, aby zezwolić na ładowanie wymaganych skryptów innych niż struktury .
    • Blazor Server W aplikacji określ skróty, aby zezwolić na ładowanie wymaganych skryptów.
  • style-src: wskazuje prawidłowe źródła arkuszy stylów.
    • Określ, aby wskazać self , ż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 z niezabezpieczonych źródeł (HTTP) powinny być bezpiecznie uzyskiwane za pośrednictwem protokołu HTTPS.
  • base-uri: ogranicza adresy URL tagu <base> strony. Określ, aby wskazać self , ż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, aby wskazać self , ż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, aby wskazać self , że źródło aplikacji, w tym schemat i numer portu, jest prawidłowym źródłem.
    • Blazor WebAssembly W aplikacji:
      • Określ unsafe-eval , aby umożliwić działanie środowiska uruchomieniowego Blazor WebAssembly Mono.
      • Określ wszelkie dodatkowe skróty, aby zezwolić na ładowanie wymaganych skryptów innych niż struktury .
    • Blazor Server W aplikacji 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, aby wskazać self , ż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 z niezabezpieczonych źródeł (HTTP) powinny być bezpiecznie uzyskiwane za pośrednictwem protokołu HTTPS.
  • base-uri: ogranicza adresy URL tagu <base> strony. Określ, aby wskazać self , ż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, aby wskazać self , ż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, aby wskazać self , że źródło aplikacji, w tym schemat i numer portu, jest prawidłowym źródłem.
    • Blazor WebAssembly W aplikacji:
      • 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.
    • Blazor Server W aplikacji 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 Blazor Server aplikacjach 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 z niezabezpieczonych źródeł (HTTP) powinny być bezpiecznie uzyskiwane 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 dostawcy CSP.
  • Skopiuj skróty dostarczone przez przeglądarkę do script-src źródeł. Używaj pojedynczych cudzysłowów wokół każdego skrótu.

Aby zapoznać się z macierzą obsługi przeglądarki poziomu 2 zasad zabezpieczeń zawartości, zobacz Can I use: Content Security Policy Level 2 (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 . Oddzielaj dyrektywy średnikami (;).
  • Zawsze umieszczaj meta tag w <head> zawartości.

W poniższych sekcjach przedstawiono przykładowe zasady dla Blazor WebAssembly i Blazor Server. Te przykłady są wersjonowane w tym artykule dla każdej wersji programu Blazor. Aby użyć wersji odpowiedniej dla danego wydania, wybierz wersję dokumentu z selektorem listy rozwijanej Wersja na tej stronie internetowej.

Blazor WebAssembly

<head> W zawartości wwwroot/index.html strony hosta 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 dla elementu Blazor WebAssembly. 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ące narzędzia przeglądarki o błędzie konsoli zgłasza skrót dla wymaganego skryptu, który nie jest objęty zasadami:

Nie można wykonać skryptu wbudowanego, ponieważ narusza on następującą dyrektywę Zasad zabezpieczeń zawartości: " ... ". Aby włączyć wykonywanie wbudowane, wymagane jest słowo kluczowe "niebezpieczne w tekście", skrót ('sha256-v8v3RKRPmN4odZ1CWM5gw80QKPCCWWMcpNeOmimNL2AA=') lub nonce ('nonce-...').

Określony skrypt skojarzony z błędem jest wyświetlany w konsoli obok błędu.

Blazor Server

W znacznikach <head> (lokalizacja <head> 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ące narzędzia przeglądarki o błędzie konsoli zgłasza skrót dla wymaganego skryptu, który nie jest objęty zasadami:

Nie można wykonać skryptu wbudowanego, ponieważ narusza on następującą dyrektywę Zasad zabezpieczeń zawartości: " ... ". Aby włączyć wykonywanie wbudowane, wymagane jest słowo kluczowe "niebezpieczne w tekście", skrót ('sha256-v8v3RKRPmN4odZ1CWM5gw80QKPCCWWMcpNeOmimNL2AA=') lub nonce ('nonce-...').

Określony skrypt skojarzony z błędem jest wyświetlany w konsoli obok błędu.

Ograniczenia tagów meta

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 otrzymywanie 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 lub nazwę nagłówka http-equiv zasad Content-Security-Policy-Report-Onlyna wartość . Raporty o błędach są wysyłane jako JSdokumenty WŁ. do określonego adresu URL. Aby uzyskać więcej informacji, zobacz Dokumentacja internetowa 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, dopóki report-to nie będzie obsługiwane przez wszystkie główne przeglądarki. Nie należy używać wyłącznie, report-uri ponieważ obsługa usługi report-uri jest w dowolnym momencie odrzucana z przeglądarek. Usuń obsługę report-uri funkcji w zasadach, gdy report-to jest ona 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 tak, aby zezwalały 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 Can I use: Content-Security-Policy (Czy mogę używać: Content-Security-Policy).

Dodatkowe zasoby