Applicare criteri di sicurezza del contenuto per ASP.NET Core Blazor
Nota
Questa non è la versione più recente di questo articolo. Per la versione corrente, vedere la versione .NET 8 di questo articolo.
Avviso
Questa versione di ASP.NET Core non è più supportata. Per altre informazioni, vedere Criteri di supporto di .NET e .NET Core. Per la versione corrente, vedere la versione .NET 8 di questo articolo.
Importante
Queste informazioni si riferiscono a un prodotto non definitive che può essere modificato in modo sostanziale prima che venga rilasciato commercialmente. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Per la versione corrente, vedere la versione .NET 8 di questo articolo.
Questo articolo illustra come usare un CSP (Content Security Policy) con ASP.NET app Core Blazor per proteggere da attacchi XSS (Cross-Site Scripting).
Scripting tra siti (XSS) è una vulnerabilità di sicurezza in cui un cyberattacker inserisce uno o più script sul lato client dannosi nel contenuto sottoposto a rendering di un'app. Un provider di servizi di configurazione consente di proteggersi da attacchi XSS informando il browser di validità:
- Origini per il contenuto caricato, inclusi script, fogli di stile, immagini e plug-in.
- Azioni eseguite da una pagina, specificando le destinazioni URL consentite dei moduli.
Per applicare un provider di servizi di configurazione a un'app, lo sviluppatore specifica diverse direttive di sicurezza del contenuto CSP in una o più Content-Security-Policy
intestazioni o <meta>
tag. Per indicazioni sull'applicazione di un provider di servizi di configurazione a un'app nel codice C# all'avvio, vedere ASP.NET avvio di CoreBlazor.
I criteri vengono valutati dal browser durante il caricamento di una pagina. Il browser esamina le origini della pagina e determina se soddisfano i requisiti delle direttive di sicurezza del contenuto. Quando le direttive dei criteri non vengono soddisfatte per una risorsa, il browser non carica la risorsa. Si consideri, ad esempio, un criterio che non consente script di terze parti. Quando una pagina contiene un <script>
tag con un'origine di terze parti nell'attributo src
, il browser impedisce il caricamento dello script.
CSP è supportato nei browser desktop e per dispositivi mobili più moderni, tra cui Chrome, Edge, Firefox, Opera e Safari. CSP è consigliato per Blazor le app.
Direttive per i criteri
Specificare minimamente le direttive e le origini seguenti per Blazor le app. Aggiungere altre direttive e origini in base alle esigenze. Le direttive seguenti vengono usate nella sezione Applica i criteri di questo articolo, in cui vengono forniti i criteri di sicurezza di esempio per Blazor le app:
- base-uri: limita gli URL per il tag di
<base>
una pagina. Specificareself
per indicare che l'origine dell'app, incluso lo schema e il numero di porta, è un'origine valida. - default-src: indica un fallback per le direttive di origine che non sono specificate in modo esplicito dai criteri. Specificare
self
per indicare che l'origine dell'app, incluso lo schema e il numero di porta, è un'origine valida. - img-src: indica le origini valide per le immagini.
- Specificare
data:
per consentire il caricamento di immagini dadata:
URL. - Specificare
https:
per consentire il caricamento di immagini dagli endpoint HTTPS.
- Specificare
- object-src: indica le origini valide per i
<object>
tag ,<embed>
e<applet>
. Specificarenone
per impedire tutte le origini URL. - script-src: indica origini valide per gli script.
- Specificare
self
per indicare che l'origine dell'app, incluso lo schema e il numero di porta, è un'origine valida. - In un'app lato Blazor client:
- Specificare
wasm-unsafe-eval
per consentire il funzionamento del runtime Mono sul lato Blazor client. - Specificare eventuali hash aggiuntivi per consentire il caricamento degli script non framework necessari.
- Specificare
- In un'app lato Blazor server specificare gli hash per consentire il caricamento degli script necessari.
- Specificare
- style-src: indica le origini valide per i fogli di stile.
- Specificare
self
per indicare che l'origine dell'app, incluso lo schema e il numero di porta, è un'origine valida. - Se l'app usa stili inline, specificare
unsafe-inline
per consentire l'uso degli stili inline.
- Specificare
- upgrade-insecure-requests: indica che gli URL del contenuto provenienti da origini HTTP non sicure devono essere acquisiti in modo sicuro tramite HTTPS.
- base-uri: limita gli URL per il tag di
<base>
una pagina. Specificareself
per indicare che l'origine dell'app, incluso lo schema e il numero di porta, è un'origine valida. - default-src: indica un fallback per le direttive di origine che non sono specificate in modo esplicito dai criteri. Specificare
self
per indicare che l'origine dell'app, incluso lo schema e il numero di porta, è un'origine valida. - img-src: indica le origini valide per le immagini.
- Specificare
data:
per consentire il caricamento di immagini dadata:
URL. - Specificare
https:
per consentire il caricamento di immagini dagli endpoint HTTPS.
- Specificare
- object-src: indica le origini valide per i
<object>
tag ,<embed>
e<applet>
. Specificarenone
per impedire tutte le origini URL. - script-src: indica origini valide per gli script.
- Specificare
self
per indicare che l'origine dell'app, incluso lo schema e il numero di porta, è un'origine valida. - In un'app lato Blazor client:
- Specificare
unsafe-eval
per consentire il funzionamento del runtime Mono sul lato Blazor client. - Specificare eventuali hash aggiuntivi per consentire il caricamento degli script non framework necessari.
- Specificare
- In un'app lato Blazor server specificare gli hash per consentire il caricamento degli script necessari.
- Specificare
- style-src: indica le origini valide per i fogli di stile.
- Specificare
self
per indicare che l'origine dell'app, incluso lo schema e il numero di porta, è un'origine valida. - Se l'app usa stili inline, specificare
unsafe-inline
per consentire l'uso degli stili inline.
- Specificare
- upgrade-insecure-requests: indica che gli URL del contenuto provenienti da origini HTTP non sicure devono essere acquisiti in modo sicuro tramite HTTPS.
- base-uri: limita gli URL per il tag di
<base>
una pagina. Specificareself
per indicare che l'origine dell'app, incluso lo schema e il numero di porta, è un'origine valida. - default-src: indica un fallback per le direttive di origine che non sono specificate in modo esplicito dai criteri. Specificare
self
per indicare che l'origine dell'app, incluso lo schema e il numero di porta, è un'origine valida. - img-src: indica le origini valide per le immagini.
- Specificare
data:
per consentire il caricamento di immagini dadata:
URL. - Specificare
https:
per consentire il caricamento di immagini dagli endpoint HTTPS.
- Specificare
- object-src: indica le origini valide per i
<object>
tag ,<embed>
e<applet>
. Specificarenone
per impedire tutte le origini URL. - script-src: indica origini valide per gli script.
- Specificare l'origine
https://stackpath.bootstrapcdn.com/
host per gli script bootstrap. - Specificare
self
per indicare che l'origine dell'app, incluso lo schema e il numero di porta, è un'origine valida. - In un'app lato Blazor client:
- Specificare
unsafe-eval
per consentire il funzionamento del runtime Mono sul lato Blazor client. - Specificare eventuali hash aggiuntivi per consentire il caricamento degli script non framework necessari.
- Specificare
- In un'app lato Blazor server specificare gli hash per consentire il caricamento degli script necessari.
- Specificare l'origine
- style-src: indica le origini valide per i fogli di stile.
- Specificare l'origine
https://stackpath.bootstrapcdn.com/
host per i fogli di stile Bootstrap. - Specificare
self
per indicare che l'origine dell'app, incluso lo schema e il numero di porta, è un'origine valida. - Specificare
unsafe-inline
per consentire l'uso di stili inline.
- Specificare l'origine
- upgrade-insecure-requests: indica che gli URL del contenuto provenienti da origini HTTP non sicure devono essere acquisiti in modo sicuro tramite HTTPS.
- base-uri: limita gli URL per il tag di
<base>
una pagina. Specificareself
per indicare che l'origine dell'app, incluso lo schema e il numero di porta, è un'origine valida. - default-src: indica un fallback per le direttive di origine che non sono specificate in modo esplicito dai criteri. Specificare
self
per indicare che l'origine dell'app, incluso lo schema e il numero di porta, è un'origine valida. - img-src: indica le origini valide per le immagini.
- Specificare
data:
per consentire il caricamento di immagini dadata:
URL. - Specificare
https:
per consentire il caricamento di immagini dagli endpoint HTTPS.
- Specificare
- object-src: indica le origini valide per i
<object>
tag ,<embed>
e<applet>
. Specificarenone
per impedire tutte le origini URL. - script-src: indica origini valide per gli script.
- Specificare l'origine
https://stackpath.bootstrapcdn.com/
host per gli script bootstrap. - Specificare
self
per indicare che l'origine dell'app, incluso lo schema e il numero di porta, è un'origine valida. - In un'app lato Blazor client:
- Specificare gli hash per consentire il caricamento degli script necessari.
- Specificare
unsafe-eval
l'usoeval()
di metodi e per la creazione di codice da stringhe.
- In un'app lato Blazor server specificare gli hash per consentire il caricamento degli script necessari.
- Specificare l'origine
- style-src: indica le origini valide per i fogli di stile.
- Specificare l'origine
https://stackpath.bootstrapcdn.com/
host per i fogli di stile Bootstrap. - Specificare
self
per indicare che l'origine dell'app, incluso lo schema e il numero di porta, è un'origine valida. - Specificare
unsafe-inline
per consentire l'uso di stili inline. La dichiarazione inline è necessaria per l'interfaccia utente per la riconnessione del client e del server dopo la richiesta iniziale. In una versione futura, lo stile inline potrebbe essere rimosso in modo cheunsafe-inline
non sia più necessario.
- Specificare l'origine
- upgrade-insecure-requests: indica che gli URL del contenuto provenienti da origini HTTP non sicure devono essere acquisiti in modo sicuro tramite HTTPS.
Le direttive precedenti sono supportate da tutti i browser ad eccezione di Microsoft Internet Explorer.
Per ottenere hash SHA per script inline aggiuntivi:
- Applicare il provider di servizi di configurazione visualizzato nella sezione Applica il criterio .
- Accedere alla console degli strumenti di sviluppo del browser durante l'esecuzione dell'app in locale. Il browser calcola e visualizza gli hash per gli script bloccati quando è presente un'intestazione o
meta
un tag CSP. - Copiare gli hash forniti dal browser nelle
script-src
origini. Usare virgolette singole per ogni hash.
Per una matrice di supporto del browser content Security Policy Level 2, vedere Can I use: Content Security Policy Level 2(I Can I use: Content Security Policy Level 2).
Applicare i criteri
Usare un <meta>
tag per applicare il criterio:
- Impostare il valore dell'attributo
http-equiv
suContent-Security-Policy
. - Inserire le direttive nel valore dell'attributo
content
. Separare le direttive con un punto e virgola (;
). - Posizionare sempre il
meta
tag nel<head>
contenuto.
Nelle sezioni seguenti vengono illustrati i criteri di esempio. Questi esempi vengono forniti con il controllo delle versioni di questo articolo per ogni versione di Blazor. Per usare una versione appropriata per la versione, selezionare la versione del documento con il selettore a discesa Versione in questa pagina Web.
App lato Blazor server
Nel contenuto applicare le direttive descritte nella sezione Direttive dei criteri:<head>
<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;">
Aggiungere altri script-src
hash e style-src
come richiesto dall'app. Durante lo sviluppo, usare uno strumento online o strumenti di sviluppo del browser per fare in modo che gli hash siano calcolati. Ad esempio, l'errore della console degli strumenti del browser seguente segnala l'hash per uno script obbligatorio non coperto dai criteri:
Rifiutato di eseguire script inline perché viola la seguente direttiva dei criteri di sicurezza del contenuto: " ... ". La parola chiave "unsafe-inline", un hash ('sha256-v8v3RKRPmN4odZ1CWM5gw80QKPCCWMcpNeOmimNL2AA=') o un nonce ('nonce-...') è necessario per abilitare l'esecuzione inline.
Lo script specifico associato all'errore viene visualizzato nella console accanto all'errore.
App lato Blazor client
Nel contenuto applicare le direttive descritte nella sezione Direttive dei criteri:<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';
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;">
Nota
L'hash sha256-v8v3RKRPmN4odZ1CWM5gw80QKPCCWMcpNeOmimNL2AA=
rappresenta lo script inline usato per le app sul lato Blazor client. Questa operazione potrebbe essere rimossa in futuro.
<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;">
Aggiungere altri script-src
hash e style-src
come richiesto dall'app. Durante lo sviluppo, usare uno strumento online o strumenti di sviluppo del browser per fare in modo che gli hash siano calcolati. Ad esempio, l'errore della console degli strumenti del browser seguente segnala l'hash per uno script obbligatorio non coperto dai criteri:
Rifiutato di eseguire script inline perché viola la seguente direttiva dei criteri di sicurezza del contenuto: " ... ". La parola chiave "unsafe-inline", un hash ('sha256-v8v3RKRPmN4odZ1CWM5gw80QKPCCWMcpNeOmimNL2AA=') o un nonce ('nonce-...') è necessario per abilitare l'esecuzione inline.
Lo script specifico associato all'errore viene visualizzato nella console accanto all'errore.
Applicare un provider di servizi di configurazione in ambienti nonDevelopment
Quando un provider di servizi di configurazione viene applicato al contenuto di un'appBlazor, interferisce con i test locali nell'ambienteDevelopment
.<head>
Ad esempio, il collegamento al browser e lo script di aggiornamento del browser non vengono caricati. Gli esempi seguenti illustrano come applicare il tag del provider di <meta>
servizi di configurazione in ambienti nonDevelopment
.
Nota
Gli esempi in questa sezione non mostrano il tag completo <meta>
per i CSP. I tag completi <meta>
sono disponibili nelle sottosezioni della sezione Applica i criteri in precedenza in questo articolo.
Sono disponibili tre approcci generali:
- Applicare il provider di servizi di configurazione tramite il
App
componente , che applica il provider di servizi di configurazione a tutti i layout dell'app. - Se è necessario applicare provider di servizi di configurazione a aree diverse dell'app, ad esempio un provider di servizi di configurazione personalizzato solo per le pagine di amministrazione, applicare i CSP in base al layout usando il
<HeadContent>
tag . Per un'efficacia completa, ogni file di layout dell'app deve adottare l'approccio. - Il servizio di hosting o il server può fornire un provider di servizi di configurazione tramite un'intestazione
Content-Security-Policy
aggiunta delle risposte in uscita di un'app. Poiché questo approccio varia in base al servizio di hosting o al server, non viene risolto negli esempi seguenti. Per adottare questo approccio, consultare la documentazione relativa al provider di servizi di hosting o al server.
Blazor Web App Approcci
App
Nel componente (Components/App.razor
) inserire IHostEnvironment:
@inject IHostEnvironment Env
App
Nel contenuto del <head>
componente applicare il provider di servizi di configurazione quando non si trova nell'ambienteDevelopment
:
@if (!Env.IsDevelopment())
{
<meta ...>
}
In alternativa, applicare i CSP in base al layout nella Components/Layout
cartella, come illustrato nell'esempio seguente. Assicurarsi che ogni layout specifichi un provider di servizi di configurazione.
@inject IHostEnvironment Env
@if (!Env.IsDevelopment())
{
<HeadContent>
<meta ...>
</HeadContent>
}
Blazor WebAssembly approcci alle app
App
Nel componente (App.razor
) inserire IWebAssemblyHostEnvironment:
@using Microsoft.AspNetCore.Components.WebAssembly.Hosting
@inject IWebAssemblyHostEnvironment Env
App
Nel contenuto del <head>
componente applicare il provider di servizi di configurazione quando non si trova nell'ambienteDevelopment
:
@if (!Env.IsDevelopment())
{
<HeadContent>
<meta ...>
</HeadContent>
}
In alternativa, usare il codice precedente, ma applicare i CSP in base al layout nella Layout
cartella. Assicurarsi che ogni layout specifichi un provider di servizi di configurazione.
Limitazioni dei tag meta
I <meta>
criteri di tag non supportano le direttive seguenti:
Per supportare le direttive precedenti, usare un'intestazione denominata Content-Security-Policy
. La stringa di direttiva è il valore dell'intestazione.
Testare un criterio e ricevere segnalazioni di violazioni
Il test consente di verificare che gli script di terze parti non vengano bloccati inavvertitamente durante la compilazione di un criterio iniziale.
Per testare un criterio in un periodo di tempo senza applicare le direttive dei criteri, impostare l'attributo o il <meta>
nome dell'intestazione del http-equiv
tag di un criterio basato su intestazione su Content-Security-Policy-Report-Only
. I report sugli errori vengono inviati come documenti JSON a un URL specificato. Per altre informazioni, vedere La documentazione Web MDN: Content-Security-Policy-Report-Only.
Per segnalare violazioni mentre un criterio è attivo, vedere gli articoli seguenti:
Sebbene report-uri
non sia più consigliato per l'uso, entrambe le direttive devono essere usate fino a quando report-to
non sono supportate da tutti i principali browser. Non usare report-uri
esclusivamente perché il supporto per report-uri
è soggetto a essere eliminato in qualsiasi momento dai browser. Rimuovere il supporto per report-uri
nei criteri quando report-to
è completamente supportato. Per tenere traccia dell'adozione di report-to
, vedere È possibile usare: report-to.
Testare e aggiornare i criteri di un'app ogni versione.
Risoluzione dei problemi
- Gli errori vengono visualizzati nella console degli strumenti di sviluppo del browser. I browser forniscono informazioni su:
- Elementi che non sono conformi ai criteri.
- Come modificare i criteri per consentire un elemento bloccato.
- Un criterio è completamente efficace solo quando il browser del client supporta tutte le direttive incluse. Per una matrice di supporto del browser corrente, vedere È possibile usare: Content-Security-Policy.