Framtvinga en innehållssäkerhetsprincip för ASP.NET Core Blazor
Not
Det här är inte den senaste versionen av den här artikeln. För den aktuella versionen, se .NET 9-versionen av den här artikeln.
Varning
Den här versionen av ASP.NET Core stöds inte längre. Mer information finns i .NET och .NET Core Support Policy. Den aktuella versionen finns i den .NET 9-versionen av den här artikeln.
Viktig
Den här informationen gäller en förhandsversionsprodukt som kan ändras avsevärt innan den släpps kommersiellt. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, med avseende på den information som tillhandahålls här.
Den aktuella versionen finns i den .NET 9-versionen av den här artikeln.
Den här artikeln beskriver hur du använder en csp- med ASP.NET Core Blazor-appar för att skydda mot XSS-attacker (Cross-Site Scripting).
XSS(Cross-Site Scripting) är en säkerhetsrisk där en cyberattacker placerar ett eller flera skadliga skript på klientsidan i en apps renderade innehåll. En CSP hjälper till att skydda mot XSS-attacker genom att informera webbläsaren om giltigt:
- Källor för inläst innehåll, inklusive skript, formatmallar, bilder och plugin-program.
- Åtgärder som vidtas av en sida och som anger tillåtna URL-mål för formulär.
För att tillämpa en CSP på en app anger utvecklaren flera CSP-innehållssäkerhet direktiv i en eller flera Content-Security-Policy
rubriker eller <meta>
taggar. Information om hur du tillämpar en CSP på en app i C#-kod vid start finns i ASP.NET Core Blazor start.
Policyer utvärderas av webbläsaren när en sida läses in. Webbläsaren inspekterar sidans källor och avgör om de uppfyller kraven i innehållssäkerhetsdirektiven. När principdirektiven inte uppfylls för en resurs läser webbläsaren inte in resursen. Tänk dig till exempel en princip som inte tillåter skript från tredje part. När en sida innehåller en <script>
tagg med ursprung från tredje part i attributet src
förhindrar webbläsaren att skriptet läses in.
CSP stöds i de flesta moderna skrivbords- och mobilwebbläsare, inklusive Chrome, Edge, Firefox, Opera och Safari. CSP rekommenderas för Blazor appar.
Policydirektiv
Ange minst följande direktiv och källor för Blazor appar. Lägg till ytterligare direktiv och källor efter behov. Följande direktiv används i avsnittet Tillämpa principen i den här artikeln, där exempel på säkerhetsprinciper för Blazor appar tillhandahålls:
-
base-uri
: Begränsar URL:erna för en sidas<base>
tagg. Angeself
för att ange att appens ursprung, inklusive schemat och portnumret, är en giltig källa. -
default-src
: Anger en reserv för källdirektiv som inte uttryckligen anges av principen. Angeself
för att ange att appens ursprung, inklusive schemat och portnumret, är en giltig källa. -
img-src
: Anger giltiga källor för bilder.- Ange
data:
för att tillåta inläsning av bilder fråndata:
URL:er. - Ange
https:
för att tillåta inläsning av bilder från HTTPS-slutpunkter.
- Ange
-
object-src
: Anger giltiga källor för taggarna<object>
,<embed>
och<applet>
. Angenone
för att förhindra alla URL-källor. -
script-src
: Anger giltiga källor för skript.- Ange
self
för att ange att appens ursprung, inklusive schemat och portnumret, är en giltig källa. - I en Blazor app på klientsidan:
- Ange
wasm-unsafe-eval
för att tillåta att Blazor Mono-runtime på klientsidan ska kunna fungera. - Ange eventuella ytterligare hashvärden för att tillåta att de nödvändiga skripten utanför ramverket laddas in.
- Ange
- I en Blazor app på serversidan anger du hashvärden för att tillåta att nödvändiga skript läses in.
- Ange
-
style-src
: Anger giltiga källor för formatmallar.- Ange
self
för att ange att appens ursprung, inklusive schemat och portnumret, är en giltig källa. - Om appen använder infogade format anger du
unsafe-inline
för att tillåta användning av infogade formatmallar.
- Ange
- upgrade-insecure-requests: Anger att innehålls-URL:er från osäkra (HTTP)-källor ska hämtas säkert via HTTPS.
-
base-uri
: Begränsar URL:erna för en sidas<base>
tagg. Angeself
för att ange att appens ursprung, inklusive schemat och portnumret, är en giltig källa. -
default-src
: Anger en reserv för källdirektiv som inte uttryckligen anges av principen. Angeself
för att ange att appens ursprung, inklusive schemat och portnumret, är en giltig källa. -
img-src
: Anger giltiga källor för bilder.- Ange
data:
för att tillåta inläsning av bilder fråndata:
URL:er. - Ange
https:
för att tillåta inläsning av bilder från HTTPS-slutpunkter.
- Ange
-
object-src
: Anger giltiga källor för taggarna<object>
,<embed>
och<applet>
. Angenone
för att förhindra alla URL-källor. -
script-src
: Anger giltiga källor för skript.- Ange
self
för att ange att appens ursprung, inklusive schemat och portnumret, är en giltig källa. - I en Blazor app på klientsidan:
- Ange
unsafe-eval
för att tillåta att klientsidans Blazor Mono-körningsmiljö fungerar. - Ange eventuella ytterligare hashvärden för att tillåta att nödvändiga skript som inte är ramverksskript läses in.
- Ange
- I en Blazor app på serversidan anger du hashvärden för att tillåta att nödvändiga skript läses in.
- Ange
-
style-src
: Anger giltiga källor för formatmallar.- Ange
self
för att ange att appens ursprung, inklusive schemat och portnumret, är en giltig källa. - Om appen använder infogade format anger du
unsafe-inline
för att tillåta användning av infogade formatmallar.
- Ange
-
upgrade-insecure-requests
: Anger att innehålls-URL:er från osäkra (HTTP)-källor ska hämtas på ett säkert sätt via HTTPS.
-
base-uri
: Begränsar URL:erna för en sidas<base>
tagg. Angeself
för att ange att appens ursprung, inklusive schemat och portnumret, är en giltig källa. -
default-src
: Anger en reserv för källdirektiv som inte uttryckligen anges av principen. Angeself
för att ange att appens ursprung, inklusive schemat och portnumret, är en giltig källa. -
img-src
: Anger giltiga källor för bilder.- Ange
data:
för att tillåta inläsning av bilder fråndata:
URL:er. - Ange
https:
för att tillåta inläsning av bilder från HTTPS-slutpunkter.
- Ange
-
object-src
: Anger giltiga källor för taggarna<object>
,<embed>
och<applet>
. Angenone
för att förhindra alla URL-källor. -
script-src
: Anger giltiga källor för skript.- Ange
https://stackpath.bootstrapcdn.com/
värdkälla för Bootstrap-skript. - Ange
self
för att ange att appens ursprung, inklusive schemat och portnumret, är en giltig källa. - I en Blazor app på klientsidan:
- Ange
unsafe-eval
för att tillåta Blazor Mono-runtime att fungera på klientsidan. - Ange eventuella ytterligare hashvärden för att tillåta att nödvändiga skript som inte är ramverksskript läses in.
- Ange
- I en Blazor app på serversidan anger du hashvärden för att tillåta att nödvändiga skript läses in.
- Ange
-
style-src
: Anger giltiga källor för formatmallar.- Ange
https://stackpath.bootstrapcdn.com/
värdkälla för Bootstrap-formatmallar. - Ange
self
för att ange att appens ursprung, inklusive schemat och portnumret, är en giltig källa. - Ange
unsafe-inline
för att tillåta användning av infogade formatmallar.
- Ange
-
upgrade-insecure-requests
: Anger att innehålls-URL:er från osäkra (HTTP)-källor ska hämtas på ett säkert sätt via HTTPS.
-
base-uri
: Begränsar URL:erna för en sidas<base>
tagg. Angeself
för att ange att appens ursprung, inklusive schemat och portnumret, är en giltig källa. -
default-src
: Anger en reserv för källdirektiv som inte uttryckligen anges av principen. Angeself
för att ange att appens ursprung, inklusive schemat och portnumret, är en giltig källa. -
img-src
: Anger giltiga källor för bilder.- Ange
data:
för att tillåta inläsning av bilder fråndata:
URL:er. - Ange
https:
för att tillåta inläsning av bilder från HTTPS-slutpunkter.
- Ange
-
object-src
: Anger giltiga källor för taggarna<object>
,<embed>
och<applet>
. Angenone
för att förhindra alla URL-källor. -
script-src
: Anger giltiga källor för skript.- Ange
https://stackpath.bootstrapcdn.com/
värdkälla för Bootstrap-skript. - Ange
self
för att ange att appens ursprung, inklusive schemat och portnumret, är en giltig källa. - I en Blazor app på klientsidan:
- Ange hashvärden för att tillåta att nödvändiga skript läses in.
- Specificera
unsafe-eval
för att användaeval()
och metoder för att skapa kod från strängar.
- I en Blazor app på serversidan anger du hashvärden för att tillåta att nödvändiga skript läses in.
- Ange
-
style-src
: Anger giltiga källor för formatmallar.- Ange
https://stackpath.bootstrapcdn.com/
värdkälla för Bootstrap-formatmallar. - Ange
self
för att ange att appens ursprung, inklusive schemat och portnumret, är en giltig källa. - Ange
unsafe-inline
för att tillåta användning av infogade formatmallar. En inline-deklaration krävs i användargränssnittet för att återansluta klienten och servern efter den första begäran. I en framtida utgåva kan inline-stil tas bort så attunsafe-inline
inte längre krävs.
- Ange
-
upgrade-insecure-requests
: Anger att innehålls-URL:er från osäkra (HTTP)-källor ska hämtas på ett säkert sätt via HTTPS.
Föregående direktiv stöds av alla webbläsare utom Microsoft Internet Explorer.
Så här hämtar du SHA-hashar för ytterligare infogade skript:
- Använd den CSP som visas i avsnittet Tillämpa principen.
- Få åtkomst till webbläsarens utvecklarverktygskonsol när du kör appen lokalt. Webbläsaren beräknar och visar hashvärden för blockerade skript när en CSP-rubrik eller
meta
tagg finns. - Kopiera hashvärdena som tillhandahålls av webbläsaren till de
script-src
källorna. Använd enkla citattecken runt varje hash.
En matris över webbläsarstöd för Innehållssäkerhetspolicy nivå 2 finns i Kan jag använda: Innehållssäkerhetspolicy nivå 2.
Tillämpa principen
Använd en <meta>
tagg för att tillämpa principen:
- Ange värdet för attributet
http-equiv
tillContent-Security-Policy
. - Placera direktiven i värdet för attributet
content
. Avgränsa direktiv med semikolon (;
). - Placera alltid taggen
meta
i<head>
-innehållet.
I följande avsnitt visas exempelprinciper. De här exemplen är versionerade tillsammans med den här artikeln för varje lansering av Blazor. Om du vill använda en version som är lämplig för din version väljer du dokumentversionen med listrutan Version på den här webbsidan.
Blazor-appar på serversidan
I <head>
innehålltillämpar du de direktiv som beskrivs i Policy-direktiven avsnittet:
<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;">
Lägg till ytterligare script-src
och style-src
hashtaggar som krävs av appen. Under utvecklingen använder du ett onlineverktyg eller webbläsarutvecklarverktyg för att få hashvärdena beräknade åt dig. Till exempel rapporterar följande felmeddelande i webbläsarens konsol hashen för ett obligatoriskt skript som inte omfattas av policyn.
Vägrade att köra infogat skript eftersom det strider mot följande innehållssäkerhetsprincipdirektiv: " ... ". Antingen nyckelordet "unsafe-inline", en hash ('sha256-v8v3RKRPmN4odZ1CWM5gw80QKPCCWMcpNeOmimNL2AA=') eller en nonce ('nonce-...') krävs för att tillåta infogad körning.
Det specifika skriptet som är associerat med felet visas i konsolen bredvid felet.
Information om hur du tillämpar en CSP på en app i C#-kod vid start finns i ASP.NET Core Blazor start.
Appar på klientsidan Blazor
I <head>
innehålltillämpar du de direktiv som beskrivs i Policy-direktiven avsnittet:
<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;">
Notera
sha256-v8v3RKRPmN4odZ1CWM5gw80QKPCCWMcpNeOmimNL2AA=
-hashen representerar det infogade skript som används för Blazor appar på klientsidan. Detta kan tas bort i framtiden.
<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;">
Lägg till ytterligare script-src
och style-src
-hashar som krävs av appen. Under utvecklingen använder du ett onlineverktyg eller webbläsarutvecklarverktyg för att få hashvärdena beräknade åt dig. Följande konsolfel för webbläsarverktyg rapporterar till exempel hashen för ett obligatoriskt skript som inte omfattas av principen:
Vägrade att köra infogat skript eftersom det strider mot följande innehållssäkerhetsprincipdirektiv: " ... ". Antingen krävs nyckelordet "unsafe-inline", en hash ('sha256-v8v3RKRPmN4odZ1CWM5gw80QKPCCWMcpNeOmimNL2AA=') eller en nonce ('nonce-...') för att aktivera inline-körning.
Det specifika skriptet som är associerat med felet visas i konsolen bredvid felet.
Tillämpa en CSP i miljöer som inte ärDevelopment
När en innehållssäkerhetspolicy tillämpas på en Blazor-appens <head>
-innehåll stör det lokala testandet i den Development
-miljön. Till exempel Webbläsarlänk och webbläsaruppdateringsskriptet kan inte läsas in. Följande exempel visar hur du tillämpar CSP:ens <meta>
tagg i icke-Development
miljöer.
Not
Exemplen i det här avsnittet visar inte hela taggen <meta>
för molntjänstleverantörerna. De fullständiga <meta>
taggarna finns i underavsnitten i avsnittet Tillämpa principen tidigare i den här artikeln.
Det finns tre allmänna metoder:
- Tillämpa CSP via komponenten
App
, som tillämpar CSP:en på alla layouter i appen. - Om du behöver tillämpa CSP:er på olika områden i appen, till exempel en anpassad CSP för endast administratörssidorna, använder du csp:erna per layout med hjälp av taggen
<HeadContent>
. För fullständig effektivitet måste varje applayoutfil använda metoden. - Värdtjänsten eller servern kan tillhandahålla en CSP via ett
Content-Security-Policy
-huvud som lagts till en app:s utgående svar. Eftersom den här metoden varierar beroende på värdtjänst eller server behandlas den inte i följande exempel. Om du vill använda den här metoden kan du läsa dokumentationen för din värdtjänstleverantör eller -server.
Blazor Web App tillvägagångssätt
I komponenten App
(Components/App.razor
) injicerar du IHostEnvironment:
@inject IHostEnvironment Env
I App
komponentens <head>
-innehåll tillämpar du CSP:en när den inte finns i den Development
miljön:
@if (!Env.IsDevelopment())
{
<meta ...>
}
Du kan också använda CSP:er per layout i mappen Components/Layout
, vilket visas i följande exempel. Kontrollera att varje layout anger en CSP.
@inject IHostEnvironment Env
@if (!Env.IsDevelopment())
{
<HeadContent>
<meta ...>
</HeadContent>
}
Blazor WebAssembly appmetoder
I komponenten App
(App.razor
) injicerar du IWebAssemblyHostEnvironment:
@using Microsoft.AspNetCore.Components.WebAssembly.Hosting
@inject IWebAssemblyHostEnvironment Env
I App
komponentens <head>
-innehåll tillämpar du CSP:en när den inte finns i den Development
miljön:
@if (!Env.IsDevelopment())
{
<HeadContent>
<meta ...>
</HeadContent>
}
Du kan också använda föregående kod men tillämpa CSP:er per layout i mappen Layout
. Kontrollera att varje layout anger en CSP.
Begränsningar för metataggen
En <meta>
taggprincip stöder inte följande direktiv:
Om du vill stödja föregående direktiv använder du en rubrik med namnet Content-Security-Policy
. Direktivsträngen är huvudrubrikens värde.
Testa en princip och ta emot överträdelserapporter
Testning hjälper till att bekräfta att skript från tredje part inte oavsiktligt blockeras när du skapar en inledande princip.
Om du vill testa en princip under en viss tidsperiod utan att tillämpa principdirektiven anger du <meta>
taggens http-equiv
-attribut eller rubriknamn för en huvudbaserad princip till Content-Security-Policy-Report-Only
. Felrapporter skickas som JSON-dokument till en angiven URL. Mer information finns i MDN:s webbdokumentation: Content-Security-Policy-Report-Only.
Information om hur du rapporterar om överträdelser när en princip är aktiv finns i följande artiklar:
Även om report-uri
inte längre rekommenderas för användning bör båda direktiven användas tills report-to
stöds av alla större webbläsare. Använd inte enbart report-uri
eftersom stöd för report-uri
kan komma att tas bort när som helst från webbläsare. Ta bort stöd för report-uri
i dina principer när report-to
stöds fullt ut. Information om hur du spårar införandet av report-to
finns i Kan jag använda: rapport-till-.
Testa och uppdatera en appens policy varje utgåva.
Felsöka
- Fel visas i webbläsarens utvecklarverktygskonsol. Webbläsare ger information om:
- Element som inte följer principen.
- Så här ändrar du principen för att tillåta ett blockerat objekt.
- En princip är bara helt effektiv när klientens webbläsare stöder alla inkluderade direktiv. En aktuell webbläsarstödmatris finns i Kan jag använda: Content-Security-Policy.
Ytterligare resurser
ASP.NET Core