Delen via


Een inhoudsbeveiligingsbeleid afdwingen voor ASP.NET Core-Blazor

Notitie

Dit is niet de nieuwste versie van dit artikel. Zie de .NET 9-versie van dit artikelvoor de huidige release.

Waarschuwing

Deze versie van ASP.NET Core wordt niet meer ondersteund. Zie de .NET- en .NET Core-ondersteuningsbeleidvoor meer informatie. Zie de .NET 9-versie van dit artikelvoor de huidige release.

Belangrijk

Deze informatie heeft betrekking op een pre-releaseproduct dat aanzienlijk kan worden gewijzigd voordat het commercieel wordt uitgebracht. Microsoft geeft geen garanties, uitdrukkelijk of impliciet, met betrekking tot de informatie die hier wordt verstrekt.

Zie de .NET 9-versie van dit artikelvoor de huidige release.

In dit artikel wordt uitgelegd hoe u een CSP- (Content Security Policy) gebruikt met ASP.NET Core Blazor-apps om bescherming te bieden tegen XSS-aanvallen (Cross-Site Scripting).

XSS- (Cross-Site Scripting) is een beveiligingsprobleem waarbij een cyberaanval een of meer schadelijke scripts aan clientzijde plaatst in de weergegeven inhoud van een app. Een CSP beschermt tegen XSS-aanvallen door de browser te informeren over geldige:

  • Bronnen voor geladen inhoud, waaronder scripts, opmaakmodellen, afbeeldingen en invoegtoepassingen.
  • Acties die door een pagina worden uitgevoerd, waarbij toegestane URL-doelen van formulieren worden opgegeven.

Als u een CSP wilt toepassen op een app, geeft de ontwikkelaar verschillende CSP-inhoudsbeveiligingsrichtlijnen op instructies in een of meer Content-Security-Policy headers of <meta> tags. Zie ASP.NET Core Blazor startupvoor richtlijnen over het toepassen van een CSP op een app in C#-code bij het opstarten.

Beleidsregels worden door de browser geëvalueerd terwijl een pagina wordt geladen. De browser inspecteert de bronnen van de pagina en bepaalt of deze voldoen aan de vereisten van de richtlijnen voor inhoudsbeveiliging. Wanneer niet aan beleidsrichtlijnen voor een resource wordt voldaan, wordt de resource niet geladen in de browser. Denk bijvoorbeeld aan een beleid dat geen scripts van derden toestaat. Wanneer een pagina een <script> tag bevat met een oorsprong van derden in het kenmerk src, voorkomt de browser dat het script wordt geladen.

CSP wordt ondersteund in de meeste moderne desktop- en mobiele browsers, waaronder Chrome, Edge, Firefox, Opera en Safari. CSP wordt aanbevolen voor Blazor apps.

Beleidsrichtlijnen

Geef minimaal de volgende instructies en bronnen op voor Blazor apps. Voeg indien nodig aanvullende instructies en bronnen toe. De volgende instructies worden gebruikt in de Het beleid toepassen sectie van dit artikel, waarbij voorbeeldbeveiligingsbeleid voor Blazor apps wordt verstrekt:

  • base-uri: hiermee beperkt u de URL's voor de <base> tag van een pagina. Geef self op om aan te geven dat de oorsprong van de app, inclusief het schema en het poortnummer, een geldige bron is.
  • default-src: Geeft een terugval aan voor bronrichtlijnen die niet expliciet zijn opgegeven door het beleid. Geef self op om aan te geven dat de oorsprong van de app, inclusief het schema en het poortnummer, een geldige bron is.
  • img-src: geeft geldige bronnen voor afbeeldingen aan.
    • Geef data: op om het laden van afbeeldingen uit data: URL's toe te laten.
    • Geef https: op om het laden van afbeeldingen vanaf HTTPS-eindpunten toe te laten.
  • object-src: geeft geldige bronnen aan voor de <object>, <embed>en <applet> tags. Geef none op om alle URL-bronnen te voorkomen.
  • script-src: Geeft geldige bronnen voor scripts aan.
    • Geef self op om aan te geven dat de oorsprong van de app, inclusief het schema en het poortnummer, een geldige bron is.
    • In een Blazor-app aan de clientzijde:
      • Geef wasm-unsafe-eval op om de Mono-runtime Blazor aan de clientzijde te laten functioneren.
      • Geef eventuele extra hashes op om uw vereiste niet-framework-scripts toe te laten laden.
    • Geef in een Blazor-app aan de serverzijde hashes op om vereiste scripts te kunnen laden.
  • style-src: geeft geldige bronnen voor stylesheets aan.
    • Geef self op om aan te geven dat de oorsprong van de app, inclusief het schema en het poortnummer, een geldige bron is.
    • Als de app inlinestijlen gebruikt, geeft u unsafe-inline op om het gebruik van uw inlinestijlen toe te staan.
  • upgrade-insecure-requests: geeft aan dat inhouds-URLs van onveilige (HTTP)-bronnen veilig via HTTPS moeten worden verkregen.
  • base-uri: hiermee beperkt u de URL's voor de <base> tag van een pagina. Geef self op om aan te geven dat de oorsprong van de app, inclusief het schema en het poortnummer, een geldige bron is.
  • default-src: Geeft een reserveoptie aan voor bronrichtlijnen die niet expliciet door het beleid zijn opgegeven. Geef self op om aan te geven dat de oorsprong van de app, inclusief het schema en het poortnummer, een geldige bron is.
  • img-src: geeft geldige bronnen voor afbeeldingen aan.
    • Geef data: op om het laden van afbeeldingen uit data: URL's toe te laten.
    • Geef https: op om het laden van afbeeldingen van HTTPS-eindpunten toe te staan.
  • object-src: geeft geldige bronnen aan voor de <object>, <embed>en <applet> tags. Geef none op om alle URL-bronnen te voorkomen.
  • script-src: Geeft geldige bronnen voor scripts aan.
    • Geef self op om aan te geven dat de oorsprong van de app, inclusief het schema en het poortnummer, een geldige bron is.
    • In een Blazor-app aan de clientzijde:
      • Geef unsafe-eval op om de Blazor Mono-runtime aan de clientzijde toe te laten werken.
      • Geef eventuele extra hashes op om uw vereiste niet-frameworkscripts toe te laten te laden.
    • Geef in een Blazor-app aan de serverzijde hashes op om vereiste scripts te kunnen laden.
  • style-src: geeft geldige bronnen voor stijlbladen aan.
    • Geef self op om aan te geven dat de oorsprong van de app, inclusief het schema en het poortnummer, een geldige bron is.
    • Als de app inlinestijlen gebruikt, geeft u unsafe-inline op om het gebruik van uw inlinestijlen toe te staan.
  • upgrade-insecure-requests: geeft aan dat inhouds-URL's van onveilige (HTTP)-bronnen veilig moeten worden verkregen via HTTPS.
  • base-uri: hiermee beperkt u de URL's voor de <base> tag van een pagina. Geef self op om aan te geven dat de oorsprong van de app, inclusief het schema en het poortnummer, een geldige bron is.
  • default-src: Geeft een alternatief aan voor bronrichtlijnen die niet expliciet door het beleid zijn gespecificeerd. Geef self op om aan te geven dat de oorsprong van de app, inclusief het schema en het poortnummer, een geldige bron is.
  • img-src: geeft geldige bronnen voor afbeeldingen aan.
    • Geef data: op om het laden van afbeeldingen uit data: URL's toe te laten.
    • Geef https: op om het laden van afbeeldingen van HTTPS-eindpunten toe te laten.
  • object-src: geeft geldige bronnen aan voor de <object>, <embed>en <applet> tags. Geef none op om alle URL-bronnen te voorkomen.
  • script-src: Geeft geldige bronnen voor scripts aan.
    • Geef de https://stackpath.bootstrapcdn.com/ hostbron op voor Bootstrap-scripts.
    • Geef self op om aan te geven dat de oorsprong van de app, inclusief het schema en het poortnummer, een geldige bron is.
    • In een Blazor-app aan de clientzijde:
      • Geef unsafe-eval op om de Mono-runtime aan de clientzijde Blazor te laten werken.
      • Geef eventuele extra hashes op om uw vereiste niet-frameworkscripts toe te laten te laden.
    • Geef in een Blazor-app aan de serverzijde hashes op om vereiste scripts te kunnen laden.
  • style-src: Geeft geldige bronnen voor stylesheets aan.
    • Geef de https://stackpath.bootstrapcdn.com/ hostbron op voor Bootstrap-stylesheets.
    • Geef self op om aan te geven dat de oorsprong van de app, inclusief het schema en het poortnummer, een geldige bron is.
    • Geef unsafe-inline op om het gebruik van inlinestijlen toe te staan.
  • upgrade-insecure-requests: geeft aan dat inhouds-URL's van onveilige (HTTP)-bronnen veilig moeten worden verkregen via HTTPS.
  • base-uri: hiermee beperkt u de URL's voor de <base> tag van een pagina. Geef self op om aan te geven dat de oorsprong van de app, inclusief het schema en het poortnummer, een geldige bron is.
  • default-src: Geeft een terugval aan voor bronrichtlijnen die niet expliciet zijn opgegeven door het beleid. Geef self op om aan te geven dat de oorsprong van de app, inclusief het schema en het poortnummer, een geldige bron is.
  • img-src: geeft geldige bronnen voor afbeeldingen aan.
    • Geef data: op om het laden van afbeeldingen uit data: URL's toe te laten.
    • Geef https: op om het laden van afbeeldingen van HTTPS-eindpunten toe te staan.
  • object-src: geeft geldige bronnen aan voor de <object>, <embed>en <applet> tags. Geef none op om alle URL-bronnen te voorkomen.
  • script-src: Geeft geldige bronnen voor scripts aan.
    • Geef de https://stackpath.bootstrapcdn.com/ hostbron op voor Bootstrap-scripts.
    • Geef self op om aan te geven dat de oorsprong van de app, inclusief het schema en het poortnummer, een geldige bron is.
    • In een Blazor-app aan de clientzijde:
      • Geef hashes op om vereiste scripts te kunnen laden.
      • Geef unsafe-eval op voor het gebruik van eval() en methoden voor het maken van code op basis van tekenreeksen.
    • Geef in een Blazor-app aan de serverzijde hashes op om vereiste scripts te kunnen laden.
  • style-src: Geeft geldige bronnen voor stijlbladen aan.
    • Geef de https://stackpath.bootstrapcdn.com/ hostbron op voor Bootstrap-opmaakmodellen.
    • Geef self op om aan te geven dat de oorsprong van de app, inclusief het schema en het poortnummer, een geldige bron is.
    • Geef unsafe-inline op om het gebruik van inlinestijlen toe te staan. De inlinedeclaratie is vereist voor de gebruikersinterface voor het opnieuw verbinden van de client en server na de eerste aanvraag. In een toekomstige release kan inlinestijl worden verwijderd, zodat unsafe-inline niet meer nodig is.
  • upgrade-insecure-requests: geeft aan dat inhouds-URL's van onveilige (HTTP)-bronnen veilig moeten worden verkregen via HTTPS.

De voorgaande richtlijnen worden ondersteund door alle browsers behalve Microsoft Internet Explorer.

SHA-hashes verkrijgen voor aanvullende inline-scripts:

  • Pas de CSP toe die wordt weergegeven in de sectie Het beleid toepassen.
  • Open de console voor ontwikkelaarshulpprogramma's van de browser tijdens het lokaal uitvoeren van de app. De browser berekent en geeft hashes weer voor geblokkeerde scripts wanneer er een CSP-header of meta tag aanwezig is.
  • Kopieer de door de browser verstrekte hashes naar de script-src bronnen. Gebruik enkele aanhalingstekens rond elke hash.

Zie Kan ik gebruiken: Content Security Policy Level 2voor een browserondersteuningsmatrix voor inhoudsbeveiligingsbeleidsniveau 2.

Het beleid toepassen

Gebruik een <meta>-tag om het beleid toe te passen:

  • Stel de waarde van het kenmerk http-equiv in op Content-Security-Policy.
  • Plaats de instructies in de content kenmerkwaarde. Afzonderlijke richtlijnen met een puntkomma (;).
  • Plaats de meta tag altijd in de <head> inhoud.

In de volgende secties ziet u voorbeeldbeleid. Deze voorbeelden zijn samen met dit artikel van een versie voorzien voor elke release van Blazor. Als u een versie wilt gebruiken die geschikt is voor uw release, selecteert u de documentversie met de versie vervolgkeuzelijst op deze webpagina.

Blazor-apps aan de serverzijde

Pas in de <head> inhoudde richtlijnen toe die worden beschreven in de beleidsrichtlijnen sectie:

<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;">

Voeg extra script-src en style-src hashes toe, zoals vereist voor de app. Gebruik tijdens de ontwikkeling een online hulpprogramma of ontwikkelaarstools voor de browser om de hashes voor u te laten berekenen. De volgende consolefout in de browserhulpprogramma's rapporteert bijvoorbeeld de hash voor een vereist script dat niet wordt gedekt door het beleid:

Geweigerd om inlinescripts uit te voeren omdat het de volgende inhoudsbeveiligingsbeleidsrichtlijn schendt: " ... ". Het sleutelwoord 'onveilige-inline', een hash ('sha256-v8v3RKRPmN4odZ1CWM5gw80QKPCCWMcpNeOmimNL2AA='), of een nonce ('nonce-...') is vereist om inline-uitvoering in te schakelen.

Het specifieke script dat aan de fout is gekoppeld, wordt weergegeven in de console naast de fout.

Zie ASP.NET Core Blazor startupvoor hulp bij het toepassen van een CSP op een app in C#-code.

Blazor-apps aan de clientzijde

Pas in de <head> inhoudde richtlijnen toe die worden beschreven in de beleidsrichtlijnen sectie:

<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;">

Notitie

De sha256-v8v3RKRPmN4odZ1CWM5gw80QKPCCWMcpNeOmimNL2AA=-hash vertegenwoordigt het inline script dat wordt gebruikt voor Blazor-apps aan de clientzijde. Dit kan in de toekomst worden verwijderd.

<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;">

Voeg extra script-src en style-src hashes toe, zoals vereist voor de app. Gebruik tijdens de ontwikkeling een online tool of browserontwikkelhulpmiddelen om de hashes voor u te laten berekenen. De volgende consolefout in de browserhulpprogramma's rapporteert bijvoorbeeld de hash voor een vereist script dat niet wordt gedekt door het beleid:

Geweigerd om inlinescripts uit te voeren omdat het de volgende inhoudsbeveiligingsbeleidsrichtlijn schendt: " ... ". Een van de sleutelwoorden 'unsafe-inline', een hash ('sha256-v8v3RKRPmN4odZ1CWM5gw80QKPCCWMcpNeOmimNL2AA=') of een nonce ('nonce-...') is vereist om inline-uitvoering in te schakelen.

Het specifieke script dat aan de fout is gekoppeld, wordt weergegeven in de console naast de fout.

Een CSP toepassen in niet-Development omgevingen

Wanneer een CSP wordt toegepast op de <head>-inhoud van een Blazor app, wordt het lokale testen in de Development-omgeving beïnvloed. Bijvoorbeeld, Browserkoppeling en het browservernieuwingsscript kunnen niet worden geladen. In de volgende voorbeelden ziet u hoe u de <meta> tag van de CSP toepast in niet-Development omgevingen.

Notitie

In de voorbeelden in deze sectie wordt niet de volledige <meta> tag voor de CSP's weergegeven. De volledige <meta> tags vindt u in de subsecties van de Het beleid toepassen sectie eerder in dit artikel.

Er zijn drie algemene benaderingen beschikbaar:

  • Pas de CSP toe via het App-onderdeel, waarmee de CSP wordt toegepast op alle indelingen van de app.
  • Als u CSP's wilt toepassen op verschillende gebieden van de app, bijvoorbeeld een aangepaste CSP voor alleen de beheerpagina's, past u de CSP's per indeling toe met behulp van de <HeadContent> tag. Voor volledige effectiviteit moet elk app-indelingsbestand de aanpak aannemen.
  • De hostingservice of server kan een CSP verschaffen via een Content-Security-Policy header die wordt toegevoegd aan de uitgaande antwoorden van een app. Omdat deze benadering verschilt per hostingservice of server, wordt deze niet behandeld in de volgende voorbeelden. Als u deze aanpak wilt aannemen, raadpleegt u de documentatie voor uw hostingserviceprovider of -server.

Blazor Web App nadert

In het App onderdeel (Components/App.razor), injecteert u IHostEnvironment:

@inject IHostEnvironment Env

Pas in de <head> inhoud van het App onderdeel de CSP toe wanneer deze zich niet in de Development-omgeving bevindt:

@if (!Env.IsDevelopment())
{
    <meta ...>
}

U kunt CSP's ook per indeling toepassen in de map Components/Layout, zoals in het volgende voorbeeld wordt gedemonstreert. Zorg ervoor dat elke indeling een CSP opgeeft.

@inject IHostEnvironment Env

@if (!Env.IsDevelopment())
{
    <HeadContent>
        <meta ...>
    </HeadContent>
}

Blazor WebAssembly app-benaderingen

In het App onderdeel (App.razor), injecteert u IWebAssemblyHostEnvironment:

@using Microsoft.AspNetCore.Components.WebAssembly.Hosting
@inject IWebAssemblyHostEnvironment Env

Pas in de <head> inhoud van het App onderdeel de CSP toe wanneer deze zich niet in de Development-omgeving bevindt:

@if (!Env.IsDevelopment())
{
    <HeadContent>
        <meta ...>
    </HeadContent>
}

U kunt ook de voorgaande code gebruiken, maar CSP's op basis van elke indeling toepassen in de map Layout. Zorg ervoor dat elke indeling een CSP opgeeft.

Beperkingen van metatags

Een <meta> tagbeleid biedt geen ondersteuning voor de volgende instructies:

Gebruik een header met de naam Content-Security-Policyom de voorgaande instructies te ondersteunen. De string voor de instructie is de waarde van de header.

Een beleid testen en schendingenrapporten ontvangen

Testen helpt te bevestigen dat scripts van derden niet per ongeluk worden geblokkeerd bij het bouwen van een eerste beleid.

Als u een beleid gedurende een bepaalde periode wilt testen zonder de beleidsrichtlijnen af te dwingen, stelt u het http-equiv kenmerk of de headernaam van een op headers gebaseerd beleid in de <meta> tag op Content-Security-Policy-Report-Only. Foutrapporten worden verzonden als JSON-documenten naar een opgegeven URL. Zie MDN-webdocumenten: Content-Security-Policy-Report-Onlyvoor meer informatie.

Raadpleeg de volgende artikelen voor het melden van schendingen terwijl een beleid actief is:

Hoewel report-uri niet meer wordt aanbevolen voor gebruik, moeten beide richtlijnen worden gebruikt totdat report-to wordt ondersteund door alle belangrijke browsers. Gebruik niet uitsluitend report-uri omdat ondersteuning voor report-uri op elk moment van browsers wordt verwijderd. Verwijder ondersteuning voor report-uri in uw beleid wanneer report-to volledig wordt ondersteund. Om de acceptatie van report-tobij te houden, zie Kan ik gebruiken: rapporteren aan.

Test en werk het beleid van een app bij voor elke release.

Problemen oplossen

  • Er worden fouten weergegeven in de console voor ontwikkelaarshulpprogramma's van de browser. Browsers bieden informatie over:
    • Elementen die niet voldoen aan het beleid.
    • Het beleid wijzigen om een geblokkeerd item toe te staan.
  • Een beleid is alleen volledig effectief wanneer de browser van de client alle opgenomen instructies ondersteunt. Zie Kan ik gebruiken: Content-Security-Policy-voor een huidige browserondersteuningsmatrix.

Aanvullende informatiebronnen