Impor uma Política de Segurança de Conteúdo para Blazor do ASP.NET Core
Observação
Esta não é a versão mais recente deste artigo. Para informações sobre a versão vigente, confira a Versão do .NET 8 deste artigo.
Aviso
Esta versão do ASP.NET Core não tem mais suporte. Para obter mais informações, confira .NET e a Política de Suporte do .NET Core. Para informações sobre a versão vigente, confira a Versão do .NET 8 deste artigo.
Importante
Essas informações relacionam-se ao produto de pré-lançamento, que poderá ser substancialmente modificado antes do lançamento comercial. A Microsoft não oferece nenhuma garantia, explícita ou implícita, quanto às informações fornecidas aqui.
Para informações sobre a versão vigente, confira a Versão do .NET 8 deste artigo.
Este artigo explica como usar uma CSP (Política de Segurança de Conteúdo) com aplicativos Blazor do ASP.NET Core para ajudar a proteger contra ataques XSS (Cross-Site Scripting).
O XSS (Cross-Site Scripting) é uma vulnerabilidade de segurança em que um invasor cibernético coloca um ou mais scripts mal-intencionados do lado do cliente no conteúdo renderizado de um aplicativo. Um CSP ajuda a proteger contra ataques XSS informando o navegador de:
- Fontes válidas de conteúdo carregado, incluindo scripts, folhas de estilos, imagens e plug-ins.
- Ações válidas executadas por uma página, especificando destinos de URL permitidos de formulários.
Para aplicar um CSP a um aplicativo, o desenvolvedor especifica várias diretivas de segurança de conteúdo CSP em um ou mais cabeçalhos Content-Security-Policy
ou marcas <meta>
. Para obter diretrizes sobre como aplicar um CSP a um aplicativo no código C# na inicialização, consulte Inicialização de Blazor do ASP.NET Core.
As políticas são avaliadas pelo navegador enquanto uma página está sendo carregada. O navegador inspeciona as fontes da página e determina se elas atendem aos requisitos das diretivas de segurança de conteúdo. Quando as diretivas de política não são atendidas para um recurso, o navegador não carrega o recurso. Por exemplo, considere uma política que não permita scripts de terceiros. Quando uma página contém uma marca <script>
com uma origem de terceiros no atributo src
, o navegador impede que o script seja carregado.
O CSP tem suporte na maioria dos navegadores móveis e desktop modernos, incluindo Chrome, Edge, Firefox, Opera e Safari. O CSP é recomendado para aplicativos Blazor.
Diretivas de política
No mínimo, especifique as seguintes diretivas e fontes para aplicativos Blazor. Adicione diretivas e fontes adicionais, conforme necessário. As seguintes diretivas são usadas na seção Aplicar a política deste artigo, em que são fornecidos exemplos de políticas de segurança para os aplicativos Blazor:
- base-uri: restringe as URLs para a marca
<base>
de uma página. Especifiqueself
para indicar que a origem do aplicativo, incluindo o esquema e o número da porta, é uma fonte válida. - default-src: indica um fallback para diretivas de origem que não são especificadas explicitamente pela política. Especifique
self
para indicar que a origem do aplicativo, incluindo o esquema e o número da porta, é uma fonte válida. - img-src: indica fontes válidas para imagens.
- Especifique
data:
para permitir o carregamento de imagens de URLsdata:
. - Especifique
https:
para permitir o carregamento de imagens de pontos de extremidade HTTPS.
- Especifique
- object-src: indica fontes válidas para as marcas
<object>
,<embed>
e<applet>
. Especifiquenone
para impedir todas as fontes de URL. - script-src: indica fontes válidas para scripts.
- Especifique
self
para indicar que a origem do aplicativo, incluindo o esquema e o número da porta, é uma fonte válida. - Em um aplicativo Blazor do lado do cliente:
- Especifique
wasm-unsafe-eval
para permitir o funcionamento do runtime Mono do Blazor do lado do cliente. - Especifique quaisquer hashes adicionais para permitir que os scripts que não são de estrutura necessários sejam carregados.
- Especifique
- Em um aplicativo Blazor do servidor, especifique hashes para permitir que os scripts necessários sejam carregados.
- Especifique
- style-src: indica fontes válidas para folhas de estilo.
- Especifique
self
para indicar que a origem do aplicativo, incluindo o esquema e o número da porta, é uma fonte válida. - Se o aplicativo usar estilos embutidos, especifique
unsafe-inline
para permitir o uso de seus estilos embutidos.
- Especifique
- upgrade-insecure-requests: indica que as URLs de conteúdo de fontes não seguras (HTTP) devem ser adquiridas com segurança por HTTPS.
- base-uri: restringe as URLs para a marca
<base>
de uma página. Especifiqueself
para indicar que a origem do aplicativo, incluindo o esquema e o número da porta, é uma fonte válida. - default-src: indica um fallback para diretivas de origem que não são especificadas explicitamente pela política. Especifique
self
para indicar que a origem do aplicativo, incluindo o esquema e o número da porta, é uma fonte válida. - img-src: indica fontes válidas para imagens.
- Especifique
data:
para permitir o carregamento de imagens de URLsdata:
. - Especifique
https:
para permitir o carregamento de imagens de pontos de extremidade HTTPS.
- Especifique
- object-src: indica fontes válidas para as marcas
<object>
,<embed>
e<applet>
. Especifiquenone
para impedir todas as fontes de URL. - script-src: indica fontes válidas para scripts.
- Especifique
self
para indicar que a origem do aplicativo, incluindo o esquema e o número da porta, é uma fonte válida. - Em um aplicativo Blazor do lado do cliente:
- Especifique
unsafe-eval
para permitir o funcionamento do runtime Mono do Blazor do lado do cliente. - Especifique quaisquer hashes adicionais para permitir que os scripts que não são de estrutura necessários sejam carregados.
- Especifique
- Em um aplicativo Blazor do servidor, especifique hashes para permitir que os scripts necessários sejam carregados.
- Especifique
- style-src: indica fontes válidas para folhas de estilo.
- Especifique
self
para indicar que a origem do aplicativo, incluindo o esquema e o número da porta, é uma fonte válida. - Se o aplicativo usar estilos embutidos, especifique
unsafe-inline
para permitir o uso de seus estilos embutidos.
- Especifique
- upgrade-insecure-requests: indica que as URLs de conteúdo de fontes não seguras (HTTP) devem ser adquiridas com segurança por HTTPS.
- base-uri: restringe as URLs para a marca
<base>
de uma página. Especifiqueself
para indicar que a origem do aplicativo, incluindo o esquema e o número da porta, é uma fonte válida. - default-src: indica um fallback para diretivas de origem que não são especificadas explicitamente pela política. Especifique
self
para indicar que a origem do aplicativo, incluindo o esquema e o número da porta, é uma fonte válida. - img-src: indica fontes válidas para imagens.
- Especifique
data:
para permitir o carregamento de imagens de URLsdata:
. - Especifique
https:
para permitir o carregamento de imagens de pontos de extremidade HTTPS.
- Especifique
- object-src: indica fontes válidas para as marcas
<object>
,<embed>
e<applet>
. Especifiquenone
para impedir todas as fontes de URL. - script-src: indica fontes válidas para scripts.
- Especifique a origem do host
https://stackpath.bootstrapcdn.com/
para scripts de inicialização. - Especifique
self
para indicar que a origem do aplicativo, incluindo o esquema e o número da porta, é uma fonte válida. - Em um aplicativo Blazor do lado do cliente:
- Especifique
unsafe-eval
para permitir o funcionamento do runtime Mono do Blazor do lado do cliente. - Especifique quaisquer hashes adicionais para permitir que os scripts que não são de estrutura necessários sejam carregados.
- Especifique
- Em um aplicativo Blazor do servidor, especifique hashes para permitir que os scripts necessários sejam carregados.
- Especifique a origem do host
- style-src: indica fontes válidas para folhas de estilo.
- Especifique a origem do host
https://stackpath.bootstrapcdn.com/
para folhas de estilo de inicialização. - Especifique
self
para indicar que a origem do aplicativo, incluindo o esquema e o número da porta, é uma fonte válida. - Especifique
unsafe-inline
para permitir o uso de estilos embutidos.
- Especifique a origem do host
- upgrade-insecure-requests: indica que as URLs de conteúdo de fontes não seguras (HTTP) devem ser adquiridas com segurança por HTTPS.
- base-uri: restringe as URLs para a marca
<base>
de uma página. Especifiqueself
para indicar que a origem do aplicativo, incluindo o esquema e o número da porta, é uma fonte válida. - default-src: indica um fallback para diretivas de origem que não são especificadas explicitamente pela política. Especifique
self
para indicar que a origem do aplicativo, incluindo o esquema e o número da porta, é uma fonte válida. - img-src: indica fontes válidas para imagens.
- Especifique
data:
para permitir o carregamento de imagens de URLsdata:
. - Especifique
https:
para permitir o carregamento de imagens de pontos de extremidade HTTPS.
- Especifique
- object-src: indica fontes válidas para as marcas
<object>
,<embed>
e<applet>
. Especifiquenone
para impedir todas as fontes de URL. - script-src: indica fontes válidas para scripts.
- Especifique a origem do host
https://stackpath.bootstrapcdn.com/
para scripts de inicialização. - Especifique
self
para indicar que a origem do aplicativo, incluindo o esquema e o número da porta, é uma fonte válida. - Em um aplicativo Blazor do lado do cliente:
- Especifique hashes para permitir que os scripts necessários sejam carregados.
- Especifique
unsafe-eval
para usareval()
e os métodos para criar código de cadeias de caracteres.
- Em um aplicativo Blazor do servidor, especifique hashes para permitir que os scripts necessários sejam carregados.
- Especifique a origem do host
- style-src: indica fontes válidas para folhas de estilo.
- Especifique a origem do host
https://stackpath.bootstrapcdn.com/
para folhas de estilo de inicialização. - Especifique
self
para indicar que a origem do aplicativo, incluindo o esquema e o número da porta, é uma fonte válida. - Especifique
unsafe-inline
para permitir o uso de estilos embutidos. A declaração embutida é necessária para a interface do usuário a fim de reconectar o cliente e o servidor após a solicitação inicial. Em uma versão futura, o estilo embutido pode ser removido para queunsafe-inline
não seja mais necessário.
- Especifique a origem do host
- upgrade-insecure-requests: indica que as URLs de conteúdo de fontes não seguras (HTTP) devem ser adquiridas com segurança por HTTPS.
As diretivas anteriores têm suporte de todos os navegadores, exceto o Microsoft Internet Explorer.
Para obter hashes SHA para scripts embutidos adicionais:
- Aplique o CSP mostrado na seção Aplicar a política.
- Acesse o console de ferramentas de desenvolvedor do navegador durante a execução do aplicativo localmente. O navegador calcula e exibe hashes para scripts bloqueados quando um cabeçalho CSP ou marca
meta
está presente. - Copie os hashes fornecidos pelo navegador para as fontes
script-src
. Use aspas simples em cada hash.
Para obter uma matriz de suporte do navegador Nível 2 da Política de Segurança de Conteúdo, consulte Posso usar: Política de Segurança de Conteúdo de Nível 2.
Aplicar a política
Use uma marca <meta>
para aplicar a política:
- Defina o valor do atributo
http-equiv
comoContent-Security-Policy
. - Coloque as diretivas no valor do atributo
content
. Diretivas separadas com ponto e vírgula (;
). - Sempre coloque a marca
meta
no conteúdo de<head>
.
As seções a seguir mostram exemplos de políticas. Esses exemplos têm controle de versão neste artigo para cada versão do Blazor. Para usar uma versão apropriada para sua versão, selecione a versão do documento com o seletor suspenso Versão nesta página da Web.
Aplicativos Blazor do lado do servidor
No conteúdo de <head>
, aplique as diretivas descritas na seção Diretivas de política:
<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;">
Adicione hashes script-src
e style-src
adicionais conforme exigido pelo aplicativo. Durante o desenvolvimento, use uma ferramenta online ou ferramentas de desenvolvedor de navegador para ter os hashes calculados para você. Por exemplo, o seguinte erro do console de ferramentas do navegador relata o hash de um script necessário não coberto pela política:
Não executou o script embutido porque viola a seguinte diretiva de Política de Segurança de Conteúdo: " ... ". A palavra-chave "unsafe-inline", um hash ("sha256-v8v3RKRPmN4odZ1CWM5gw80QKPCCWMcpNeOmimNL2AA=") ou um nonce ("nonce-...") é necessário para habilitar a execução embutida.
O script específico associado ao erro é exibido no console ao lado do erro.
Aplicativos Blazor do lado do cliente
No conteúdo de <head>
, aplique as diretivas descritas na seção Diretivas de política:
<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;">
Observação
O hash sha256-v8v3RKRPmN4odZ1CWM5gw80QKPCCWMcpNeOmimNL2AA=
representa o script embutido usado para aplicativos Blazor do lado do cliente. Isso pode ser removido no 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;">
Adicione hashes script-src
e style-src
adicionais conforme exigido pelo aplicativo. Durante o desenvolvimento, use uma ferramenta online ou ferramentas de desenvolvedor de navegador para ter os hashes calculados para você. Por exemplo, o seguinte erro do console de ferramentas do navegador relata o hash de um script necessário não coberto pela política:
Não executou o script embutido porque viola a seguinte diretiva de Política de Segurança de Conteúdo: " ... ". A palavra-chave "unsafe-inline", um hash ("sha256-v8v3RKRPmN4odZ1CWM5gw80QKPCCWMcpNeOmimNL2AA=") ou um nonce ("nonce-...") é necessário para habilitar a execução embutida.
O script específico associado ao erro é exibido no console ao lado do erro.
Aplicar um CSP em ambientes não Development
Quando um CSP é aplicado ao conteúdo <head>
de um aplicativo Blazor, ele interfere nos testes locais no ambiente Development
. Por exemplo, o Link do Navegador e o script de atualização do navegador não carregam. Os exemplos a seguir demonstram como aplicar a marca <meta>
do CSP em ambientes não Development
.
Observação
Os exemplos desta seção não mostram a marca <meta>
completa para os CSPs. As marcas <meta>
concluídas são encontradas nas subseções da seção Aplicar a política anteriormente neste artigo.
Três abordagens gerais estão disponíveis:
- Aplique o CSP por meio do componente
App
, que aplica o CSP a todos os layouts do aplicativo. - Se precisar aplicar CSPs a diferentes áreas do aplicativo, por exemplo, um CSP personalizado apenas para as páginas de administração, aplique os CSPs por layout usando a marca
<HeadContent>
. Para uma eficácia completa, cada arquivo de layout de aplicativo deve adotar a abordagem. - O servidor ou serviço de hospedagem pode fornecer um CSP por meio de um cabeçalho
Content-Security-Policy
adicionado às respostas de saída de um aplicativo. Como essa abordagem varia de acordo com o servidor ou serviço de hospedagem, ela não será abordada nos exemplos a seguir. Se quiser adotar essa abordagem, consulte a documentação do seu provedor de serviços de hospedagem ou servidor.
Abordagens do Blazor Web App
No componente App
(Components/App.razor
), injete IHostEnvironment:
@inject IHostEnvironment Env
No conteúdo <head>
do componente App
, aplique o CSP quando não estiver no ambiente Development
:
@if (!Env.IsDevelopment())
{
<meta ...>
}
Alternativamente, aplique CSPs em uma base por layout na pasta Components/Layout
, conforme demonstrado no exemplo a seguir. Certifique-se de que todo layout especifique um CSP.
@inject IHostEnvironment Env
@if (!Env.IsDevelopment())
{
<HeadContent>
<meta ...>
</HeadContent>
}
abordagens de aplicativos Blazor WebAssembly
No componente App
(App.razor
), injete IWebAssemblyHostEnvironment:
@using Microsoft.AspNetCore.Components.WebAssembly.Hosting
@inject IWebAssemblyHostEnvironment Env
No conteúdo <head>
do componente App
, aplique o CSP quando não estiver no ambiente Development
:
@if (!Env.IsDevelopment())
{
<HeadContent>
<meta ...>
</HeadContent>
}
Alternativamente, use o código anterior, mas aplique os CSPs em uma base por layout na pasta Layout
. Certifique-se de que todo layout especifique um CSP.
Limitações de marca META
Uma política de marca <meta>
não dá suporte às seguintes diretivas:
Para dar suporte às diretivas anteriores, use um cabeçalho chamado Content-Security-Policy
. A cadeia de caracteres de diretiva é o valor do cabeçalho.
Testar uma política e receber relatórios de violação
O teste ajuda a confirmar se os scripts de terceiros não foram bloqueados inadvertidamente ao criar uma política inicial.
Para testar uma política durante um período de tempo sem impor as diretivas de política, defina o atributo http-equiv
da marca <meta>
ou o nome do cabeçalho de uma política baseada em cabeçalho como Content-Security-Policy-Report-Only
. Os relatórios de falha são enviados como documentos JSON para uma URL especificada. Para obter mais informações, consulte Documentos da Web do MDN: Content-Security-Policy-Report-Only.
Para relatar violações enquanto uma política está ativa, consulte os seguintes artigos:
Embora report-uri
não seja mais recomendado para uso, ambas as diretivas devem ser usadas até que report-to
seja compatível com todos os principais navegadores. Não use report-uri
exclusivamente porque o suporte para report-uri
está sujeito a remoção a qualquer momento dos navegadores. Remova o suporte para report-uri
em suas políticas quando report-to
tiver suporte total. Para acompanhar a adoção do report-to
, consulte Posso usar: report-to.
Teste e atualize a política de um aplicativo a cada versão.
Solucionar problemas
- Os erros aparecem no console de ferramentas para desenvolvedores do navegador. Os navegadores fornecem informações sobre:
- Elementos que não estão em conformidade com a política.
- Como modificar a política para permitir um item bloqueado.
- Uma política só é completamente eficaz quando o navegador do cliente dá suporte a todas as diretivas incluídas. Para obter uma matriz de suporte do navegador atual, consulte Posso usar: Content-Security-Policy.