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 bepaalde soorten schadelijke aanvallen, zoals XSS- (Cross-Site Scripting) en clickjacking aanvallen. XSS is een beveiligingsprobleem waarbij een cyberaanval een of meer schadelijke scripts aan clientzijde plaatst in de weergegeven inhoud van een app. Bij een clickjacking-aanval wordt een gebruiker misleid in interacties met een decoderingswebsite waarin uw app is ingesloten.

Een CSP beschermt tegen deze soorten aanvallen door de browser te informeren over geldige aanvallen:

  • 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.
  • Wanneer uw app kan worden ingesloten in een andere website via <frame>, <iframe>, <object>of <embed> tags.

We raden u aan de volgende MDN-resources te lezen bij het implementeren van een CSP:

Als u een CSP wilt toepassen op een app, geeft de ontwikkelaar verschillende CSP-inhouds beveiligingsrichtlijnen richtlijnen op in een of meer Content-Security-Policy headers of <meta> tags. Zie voor hulp bij het toepassen van een CSP op een app in C#-code bij de opstartprocedure ASP.NET Core Blazor en de de frame-ancestors instructie sectie verderop in dit artikel.

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.

Waarschuwing

Het implementeren van een CSP minimaliseert het risico van bepaalde typen beveiligingsrisico's en garandeert niet dat een app volledig veilig is tegen XSS- en clickjacking-aanvallen. Gebruikersagents, meestal browsers, kunnen gebruikers toestaan om beleidshandhaving te wijzigen of over teslaan via gebruikersvoorkeuren, bladwijzers, browserextensies, toevoegingen van derden aan de gebruikersagent en andere dergelijke mechanismen. CSP's zijn ook alleen gericht op het oplossen van een subset van aanvallen, niet alle aanvallen die de beveiliging kunnen schenden, zoals SQL-injectie, CSRF (Cross-Site Request Forgery), onjuiste configuratie van beveiliging en DoS-aanvallen (Denial-of-Service).

Beleidsrichtlijnen

De volgende instructies en bronnen worden vaak gebruikt voor Blazor apps. Voeg indien nodig aanvullende instructies en bronnen toe. De volgende instructies worden gebruikt in het Het beleid toepassen gedeelte 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 bijvoorbeeld unsafe-hashes op met een hash van sha256-qnHnQs7NjQNHHNYv/I9cW+I62HzDJjbnyS/OFzqlix0= om de inline JavaScript toe te staan voor de navigatietoggler in de NavMenu-component.
    • 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.
  • connect-src: hiermee beperkt u de URL's die kunnen worden geladen met behulp van scriptinterfaces. De schemabronnen http:, ws: (WebSocket-protocol) en wss: (WebSocket Secure-protocol) worden opgegeven.
  • 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 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 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.
  • connect-src: hiermee beperkt u de URL's die kunnen worden geladen met behulp van scriptinterfaces. De schemabronnen http:, ws: (WebSocket-protocol) en wss: (WebSocket Secure-protocol) worden opgegeven.
  • 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 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 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 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 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.
  • connect-src: hiermee beperkt u de URL's die kunnen worden geladen met behulp van scriptinterfaces. De schemabronnen http:, ws: (WebSocket-protocol) en wss: (WebSocket Secure-protocol) worden opgegeven.
  • 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 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 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 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. 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.
  • connect-src: hiermee beperkt u de URL's die kunnen worden geladen met behulp van scriptinterfaces. De schemabronnen http:, ws: (WebSocket-protocol) en wss: (WebSocket Secure-protocol) worden opgegeven.
  • 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

U kunt een CSP toepassen via:

Een <meta>-tag gebruiken 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 (;). Een eindkomma voor de laatste instructie van de beleidsreeks is niet vereist volgens de specificatie van het inhoudsbeveiligingsbeleidsniveau 3.
  • Plaats de <meta> tag in de <head> inhoud net binnen de openingstag <head>. Het beleid wordt geëvalueerd en gehandhaafd wanneer de CSP-opmaak wordt verwerkt; daarom moet het beleid bovenaan de <head>-opmaak worden geplaatst om te garanderen dat het wordt toegepast op alle <script>- en <link>-tags.

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.

De frame-ancestors richtlijn

De frame-ancestors-richtlijn specificeert geldige ouders die een pagina kunnen insluiten met de <frame>-, <iframe>-, <object>- of <embed>-tags. Een frame-ancestors-instructie kan niet worden toegepast via een <meta> op tags gebaseerde CSP. De richtlijn moet worden toegepast via een antwoordheader. Een CSP-antwoordheader kan worden toegevoegd door een serverhost of app C#-code kan een CSP toevoegen of bijwerken met een frame-ancestors instructie.

Blazor Web Apps (.NET 8 of hoger) bevatten automatisch een antwoordheader die de waarde instelt op 'self':

Content-Security-Policy: frame-ancestors 'self'

Als u de standaardwaarde wilt wijzigen in de meer beperkende 'none' en wilt voorkomen dat alle ouders de app insluiten, stelt u de optie ContentSecurityFrameAncestorsPolicy in de aanroep in op AddInteractiveServerRenderMode in het Program-bestand. Het volgende wordt alleen van kracht wanneer WebSocket-compressie is ingeschakeld (ConfigureWebSocketAcceptContext is ingesteld, wat de standaardinstelling is voor Blazor-apps).

.AddInteractiveServerRenderMode(o => o.ContentSecurityFrameAncestorsPolicy = "'none'")

In Blazor Server-apps wordt er geen standaard-frame-ancestors-instructie toegevoegd aan de verzameling antwoordheaders. U kunt handmatig een CSP-header toevoegen met middleware in de pijplijn voor aanvraagverwerking:

app.Use(async (context, next) =>
{
    context.Response.Headers.Add("Content-Security-Policy", "frame-ancestors 'none'");
    await next();
});

Waarschuwing

Vermijd het instellen van de frame-ancestors instructiewaarde op 'null' wanneer WebSocket-compressie is ingeschakeld (compressie is de standaardinstelling), omdat de app kwetsbaar is voor schadelijke scriptinjectie en clickjacking-aanvallen.

Ga voor meer informatie naar CSP: frame-ancestors (MDN-documentatie).

Blazor-apps aan de serverzijde

Het volgende voorbeeld is een uitgangspunt voor verdere ontwikkeling. Pas bovenaan <head> inhoudde richtlijnen toe die worden beschreven in de sectie Beleidsrichtlijnen, samen met eventuele andere richtlijnen die uw app-specificatie vereist.

Voor apps van Blazor Web Appof Blazor Server:

<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' 'unsafe-hashes' 
        'sha256-qnHnQs7NjQNHHNYv/I9cW+I62HzDJjbnyS/OFzqlix0=';
    style-src https:;
    connect-src 'self' http: ws: wss:;
    upgrade-insecure-requests;" />

Blazor Web Appbevat een inline onclick JavaScript-gebeurtenishandler in het NavMenu-onderdeel waarvoor een van de volgende wijzigingen is vereist:

  • Voeg een hash toe aan de script-src-instructie met het trefwoord unsafe-hashes:

    'unsafe-hashes' 'sha256-qnHnQs7NjQNHHNYv/I9cW+I62HzDJjbnyS/OFzqlix0='
    

    Zie CSP: script-src: Onveilige inlinescript (MDN-documentatie)voor meer informatie.

  • Verplaats de inline JavaScript-gebeurtenishandler naar een JavaScript-bestand of -module die door het beleid mag worden geladen.

Blazor Web Appheeft ook een ImportMap component in <head> content waarmee een inline import map <script> tag wordt weergegeven. Als u het beleid wilt wijzigen om de import map te kunnen laden, zie de CSP-schendingen oplossen met Subresource Integrity (SRI) of een cryptografische nonce sectie.

Voor Blazor Server apps:

<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';
    connect-src 'self' http: ws: wss:;
    upgrade-insecure-requests">

Voor Blazor Server apps:

<meta http-equiv="Content-Security-Policy" content="
    base-uri 'self';
    default-src 'self';
    img-src data: https:;
    object-src 'none';
    script-src 'self' https://stackpath.bootstrapcdn.com/;
    style-src 'self' 'unsafe-inline' https://stackpath.bootstrapcdn.com/;
    connect-src 'self' http: ws: wss:;
    upgrade-insecure-requests">

Voor Blazor Server apps:

<meta http-equiv="Content-Security-Policy" content="
    base-uri 'self';
    default-src 'self';
    img-src data: https:;
    object-src 'none';
    script-src 'self' https://stackpath.bootstrapcdn.com/ 
        'sha256-34WLX60Tw3aG6hylk0plKbZZFXCuepeQ6Hu7OqRf8PI=';
    style-src 'unsafe-inline' https://stackpath.bootstrapcdn.com/;
    connect-src 'self' http: ws: wss:;
    upgrade-insecure-requests">

Notitie

De voorgaande SHA256-hash is bedoeld voor demonstratiedoeleinden. Mogelijk moet u een nieuwe hash voor uw CSP berekenen.

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 browserhulpmiddelen rapporteert bijvoorbeeld de hash voor een vereist script dat niet door het beleid wordt gedekt:

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 richtlijnen over het toepassen van een CSP op een app in C#-code bij het opstarten.

Blazor-apps aan de clientzijde

Het volgende voorbeeld is een uitgangspunt voor verdere ontwikkeling. 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';
    connect-src 'none';
    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';
    connect-src 'none';
    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' 
        'sha256-v8v3RKRPmN4odZ1CWM5gw80QKPCCWMcpNeOmimNL2AA=';
    style-src 'self';
    connect-src 'none';
    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 'self' 'unsafe-eval' https://stackpath.bootstrapcdn.com/ 
        'sha256-v8v3RKRPmN4odZ1CWM5gw80QKPCCWMcpNeOmimNL2AA=';
    style-src 'self' 'unsafe-inline' https://stackpath.bootstrapcdn.com/;
    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' https://stackpath.bootstrapcdn.com/ 
        'sha256-v8ZC9OgMhcnEQ/Me77/R9TlJfzOBqrMTW8e1KuqLaqc=' 
        'sha256-If//FtbPc03afjLezvWHnC3Nbu4fDM04IIzkPaf3pH0=' 
        'sha256-v8v3RKRPmN4odZ1CWM5gw80QKPCCWMcpNeOmimNL2AA=';
    style-src 'self' 'unsafe-inline' https://stackpath.bootstrapcdn.com/;
    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. Een voorbeeld hiervan is de volgende consolefout in de browsertools, die de hash rapporteert voor een vereist script dat niet door het beleid wordt gedekt:

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.

CSP-schendingen oplossen met Subresource Integrity (SRI) of een cryptografische nonce

Twee benaderingen voor het oplossen van CSP-schendingen, die in de volgende twee secties worden beschreven, zijn:

Subresource-integriteit (SRI) toepassen

Met subresource Integrity (SRI) kunnen browsers bevestigen dat opgehaalde resources niet tijdens overdracht worden gemanipuleerd. Een cryptografische hash die op de resource is opgegeven, moet overeenkomen met de hash die door de browser wordt berekend voor de opgehaalde resource en de hash die wordt vermeld in de CSP. Browsercompatibiliteit kan worden beoordeeld bij Kan ik het gebruiken? Subresource-integriteit.

In het volgende voorbeeld voor een Blazor Server-app wordt een integriteit berekend met behulp van een hulpprogramma van derden en opgegeven voor het Blazor script (blazor.server.js) en CSP. Het Blazor script wordt in dit scenario niet dynamisch gewijzigd en heeft een stabiele SHA-hash, zodat u de waarde van het integrity kenmerk kunt coderen.

Waarschuwing

Stel het kenmerk crossorigin in op een subresource die vanuit een andere oorsprong wordt geladen zonder CORS-(Cross-Origin Resource Sharing). Als de oorsprong van de app verschilt van waar een subresource wordt geladen, is een Access-Control-Allow-Origin header vereist waarmee de resource kan worden gedeeld met de aangevraagde origin-of anders het kenmerk crossorigin moet worden toegepast op de tag van de subresource in de app. Anders gaat de browser over op het beleid 'fail-open' voor de subresource, wat betekent dat de subresource wordt geladen zonder de integriteit ervan te controleren.

Het kenmerk crossorigin wordt niet toegevoegd aan de Blazor<script> tag in het volgende voorbeeld omdat het Blazor script wordt geladen vanuit de oorsprong van de app.

Zie MDN-documentatie (Cross-Origin Resource Sharing and Subresource Integrity)voor meer informatie.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta http-equiv="Content-Security-Policy" content="
        base-uri 'self';
        default-src 'self';
        img-src data: https:;
        object-src 'none';
        script-src 'sha256-FyuamsHhg0nWZUnu/f5qrt2DlL1XKt5AX+cgRhtxtfg=';
        style-src https:;
        connect-src 'self' http: ws: wss:;
        upgrade-insecure-requests;" />
    ...
</head>
<body>
    ...
    <script src="_framework/blazor.server.js" 
        integrity="sha256-FyuamsHhg0nWZUnu/f5qrt2DlL1XKt5AX+cgRhtxtfg="></script>
</body>
</html>

In het volgende voorbeeld voor een Blazor Web App (.NET 8 of hoger) wordt een integriteit berekend voor het ImportMap-onderdeel (.NET 9 of hoger). De ImportMap integriteitswaarde wordt berekend voor elke app-aanvraag, omdat het ImportMap onderdeel unieke inhoud weergeeft telkens wanneer de pagina wordt gegenereerd voor assets met vingerafdruk.

De gerenderde importtoewijzing van het ImportMap-onderdeel wordt gegenereerd door de app bij de bron, zodat het crossorigin kenmerk niet is opgenomen in de ImportMap-tag. Zie MDN CSP Guide: Hashes en Subresource Integrity (MDN-documentatie)voor meer informatie.

@using System.Security.Cryptography
<!DOCTYPE html>
<html lang="en">
<head>
    <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' 'unsafe-hashes' '@integrity'
            'sha256-qnHnQs7NjQNHHNYv/I9cW+I62HzDJjbnyS/OFzqlix0=';
        style-src https:;
        connect-src 'self' http: ws: wss:;
        upgrade-insecure-requests;" />
    ...
    <ImportMap integrity="@integrity" />
    ...
</head>
...
</html>

@code {
    private string? integrity;

    [CascadingParameter]
    public HttpContext? HttpContext { get; set; }

    protected override void OnInitialized()
    {
        var metadata = HttpContext?.GetEndpoint()?.Metadata
            .GetOrderedMetadata<ImportMapDefinition>();
        var utf8 = new System.Text.UTF8Encoding();
        var metadataBytes = utf8.GetBytes(
            metadata?.FirstOrDefault<ImportMapDefinition>()?.ToString()
                .ReplaceLineEndings("\n") ?? string.Empty);
        integrity = 
            $"sha256-{Convert.ToBase64String(SHA256.HashData(metadataBytes))}";
    }
}

Gebruik vóór .NET 6 .Replace("\r\n", "\n") in plaats van ReplaceLineEndings in de voorgaande code aan te roepen.

Notitie

Als er extra kenmerken moeten worden afgeplatt op het weergegeven <script>ImportMap element van de ImportMap onderdelen, kunt u een woordenlijst van alle kenmerken doorgeven aan het ImportMap onderdeel in de eigenschap AdditionalAttributes. Het integrity kenmerknaam-waardepaar wordt doorgegeven in het woordenboek met de rest van de aanvullende doorgegeven kenmerken.

Een cryptografische nonce gebruiken

Met een cryptografische nonce (getal dat eenmaal) wordt gebruikt, kunnen browsers bevestigen dat opgehaalde resources niet worden gemanipuleerd tijdens de overdracht. Een voor eenmalig gebruik bedoelde cryptografische nonce die in de CSP is opgegeven, moet overeenkomen met de nonce die op de bron is aangegeven. Browsercompatibiliteit kan worden beoordeeld op Kan ik gebruiken? Nonce.

In het volgende voorbeeld voor een Blazor Web App (.NET 8 of hoger) wordt er een nonce gemaakt voor het ImportMap-onderdeel (.NET 9 of hoger) met een unieke waarde telkens wanneer de app wordt geladen.

Voor meer informatie, zie MDN CSP Guide: Nonces en CSP: script-src: Onveilig inline script (MDN documentation).

@using System.Security.Cryptography
<!DOCTYPE html>
<html lang="en">
<head>
    <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' 'unsafe-hashes' 'nonce-@nonce' 
            'sha256-qnHnQs7NjQNHHNYv/I9cW+I62HzDJjbnyS/OFzqlix0=';
        style-src https:;
        connect-src 'self' http: ws: wss:;
        upgrade-insecure-requests;" />
    ...
    <ImportMap nonce="@nonce" />
    ...
</head>
...
</html>

@code {
    private string? nonce;

    protected override void OnInitialized()
    {
        using (var rng = RandomNumberGenerator.Create())
        {
            var nonceBytes = new byte[32];
            rng.GetBytes(nonceBytes);
            nonce = Convert.ToBase64String(nonceBytes);
        }
    }
}

Notitie

Als er extra kenmerken moeten worden toegevoegd aan het weergegeven ImportMap element van de <script> component, kunt u een woordenlijst van alle kenmerken doorgeven aan de ImportMap component in de eigenschap AdditionalAttributes. Het niet-naam-waardepaar wordt doorgegeven in de woordenlijst met de rest van de aanvullende doorgegeven kenmerken.

Een CSP toepassen in niet-Development omgevingen

Wanneer een CSP wordt toegepast op de Blazor-inhoud van een <head> 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 App inhoud van het <head> 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 App inhoud van het <head> 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 <meta> kenmerk of de headernaam van een op headers gebaseerd beleid in de http-equiv 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