Implemente uma política de segurança de conteúdo para o ASP.NET Core Blazor
Observação
Esta não é a versão mais recente deste artigo. Para a versão atual, consulte a versão .NET 9 deste artigo.
Advertência
Esta versão do ASP.NET Core não é mais suportada. Para obter mais informações, consulte a Política de suporte do .NET e .NET Core. Para a versão atual, consulte a versão .NET 9 deste artigo.
Importante
Estas informações referem-se a um produto de pré-lançamento que pode ser substancialmente modificado antes de ser lançado comercialmente. A Microsoft não oferece garantias, expressas ou implícitas, em relação às informações fornecidas aqui.
Para a versão atual, consulte a versão .NET 9 deste artigo.
Este artigo explica como usar um de Política de Segurança de Conteúdo (CSP) do
Cross-Site Scripting (XSS) é uma vulnerabilidade de segurança em que um ciberatacante 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 sobre a validade de:
- Fontes para conteúdo carregado, incluindo scripts, folhas de estilo, imagens e plugins.
- Ações 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 de segurança de conteúdo CSP em um ou mais cabeçalhos Content-Security-Policy
ou <meta>
tags. Para obter orientação sobre como aplicar uma política de segurança de conteúdo a uma aplicação no código C# durante o arranque, consulte ASP.NET Core Blazor arranque.
As políticas são avaliadas pelo navegador enquanto uma página é 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 tag <script>
com origem de terceiros no atributo src
, o navegador impede que o script seja carregado.
O CSP é compatível com a maioria dos navegadores modernos para desktop e dispositivos móveis, incluindo Chrome, Edge, Firefox, Opera e Safari. O CSP é recomendado para aplicativos Blazor.
Diretivas políticas
Minimamente, especifique as seguintes diretivas e fontes para aplicações Blazor. Adicione diretivas e fontes adicionais, conforme necessário. As diretivas a seguir são usadas na seção Aplicar a política deste artigo, onde são fornecidas exemplos de políticas de segurança para aplicativos Blazor:
-
base-uri
: Restringe os URLs da tag<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 uma alternativa para diretivas de origem que não são especificadas explicitamente pela política. Especifiqueself
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 dedata:
URLs. - Especifique
https:
para permitir o carregamento de imagens a partir de endpoints HTTPS.
- Especifique
-
object-src
: Indica fontes válidas para as tags<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. - Numa aplicação Blazor de cliente:
- Especifique
wasm-unsafe-eval
para permitir que o runtime Mono do lado do cliente Blazor funcione. - Especifique quaisquer hashes adicionais para permitir que os seus scripts necessários não dependentes de estrutura sejam carregados.
- Especifique
- Em um aplicativo Blazor do lado 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 usa estilos embutidos, especifique
unsafe-inline
para permitir o uso de seus estilos embutidos.
- Especifique
- upgrade-insecure-requests: Indica que URLs de conteúdo provenientes de fontes inseguras (HTTP) devem ser obtidas de forma segura através de HTTPS.
-
base-uri
: Restringe os URLs da tag<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 uma opção de contingência para diretivas de origem que não são especificadas explicitamente pela política. Especifiqueself
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 dedata:
URLs. - Especifique
https:
para permitir o carregamento de imagens de endpoints HTTPS.
- Especifique
-
object-src
: Indica fontes válidas para as tags<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. - Numa aplicação Blazor do lado cliente:
- Especifique
unsafe-eval
para permitir que o tempo de execução do Blazor Mono do lado do cliente funcione. - Especifique quaisquer hashes adicionais para permitir que os seus scripts necessários fora de framework sejam carregados.
- Especifique
- Numa aplicação Blazor do lado 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 usa estilos embutidos, especifique
unsafe-inline
para permitir o uso de seus estilos embutidos.
- Especifique
-
upgrade-insecure-requests
: Indica que URLs de conteúdo de fontes inseguras (HTTP) devem ser adquiridas com segurança por HTTPS.
-
base-uri
: Restringe os URLs da tag<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 uma opção alternativa para diretivas de origem que não são especificadas explicitamente pela política. Especifiqueself
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 dedata:
URLs. - Especifique
https:
para permitir o carregamento de imagens de endpoints HTTPS.
- Especifique
-
object-src
: Indica fontes válidas para as tags<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 Bootstrap. - 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 que o tempo de execução do Blazor Mono do lado do cliente funcione. - Especifique quaisquer hashes adicionais para permitir que seus scripts necessários não estruturais sejam carregados.
- Especifique
- Em um aplicativo Blazor do lado 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 do Bootstrap. - 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 URLs de conteúdo de fontes inseguras (HTTP) devem ser adquiridas com segurança por HTTPS.
-
base-uri
: Restringe os URLs da tag<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. Especifiqueself
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 dedata:
URLs. - Especifique
https:
para permitir o carregamento de imagens de endpoints HTTPS.
- Especifique
-
object-src
: Indica fontes válidas para as tags<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 Bootstrap. - 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 métodos para criar código a partir de strings.
- Em uma aplicação Blazor do lado 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 do Bootstrap. - 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 inline. A declaração embutida é necessária para que a interface do usuário reconecte o cliente e o servidor após a solicitação inicial. Numa versão futura, o estilo em linha pode ser removido para queunsafe-inline
não seja mais necessário.
- Especifique a origem do host
-
upgrade-insecure-requests
: Indica que URLs de conteúdo de fontes inseguras (HTTP) devem ser adquiridas com segurança por HTTPS.
As diretivas anteriores são suportadas por todos os navegadores, exceto o Microsoft Internet Explorer.
Para obter hashes SHA para scripts em linha adicionais:
- Aplique o CSP mostrado na seção Aplica a política.
- Acesse o console de ferramentas de desenvolvedor do navegador enquanto executa o aplicativo localmente. O navegador calcula e exibe hashes para scripts bloqueados quando um cabeçalho CSP ou uma tag
meta
está presente. - Copie os hashes fornecidos pelo navegador para as fontes
script-src
. Use aspas simples em torno de 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 Nível 2.
Aplicar a política
Use uma tag <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 (;
). - Coloque sempre a etiqueta
meta
no conteúdo<head>
.
As seções a seguir mostram exemplos de políticas. Estes exemplos são versionados com este artigo para cada versão do Blazor. Para usar uma versão apropriada para o seu lançamento, selecione a versão do documento com o seletor suspenso Versão nesta página web.
Aplicativos Blazor do lado do servidor
No conteúdo <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 necessário pelo aplicativo. Durante o desenvolvimento, use uma ferramenta on-line ou ferramentas de desenvolvedor de navegador para ter os hashes calculados para você. Por exemplo, o seguinte relatório de erro no console de ferramentas do navegador reporta o hash para um script necessário não coberto pela política:
Recusou-se a executar 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 em linha.
O script específico associado ao erro é exibido no console ao lado do erro.
Para obter orientação sobre como aplicar um CSP a uma aplicação em código C# durante a inicialização, consulte ASP.NET Core Blazor startup.
Aplicações do lado cliente Blazor
No conteúdo <head>
, aplique as diretivas descritas na seção de 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;">
<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 adicionais de script-src
e style-src
conforme necessário pelo aplicativo. Durante o desenvolvimento, use uma ferramenta on-line ou ferramentas de desenvolvedor de navegador para ter os hashes calculados para você. Por exemplo, o seguinte erro de console das ferramentas do navegador relata o hash para um script necessário não coberto pela política:
Recusou-se a executar 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-...') são necessários para habilitar a execução em linha.
O script específico associado ao erro é exibido no console ao lado do erro.
Aplicar um CSP em ambientes nãoDevelopment
Quando um CSP é aplicado ao conteúdo <head>
de um aplicativo Blazor, ele interfere no teste local no ambiente Development
. Por exemplo, Browser Link e o script de atualização do navegador não são carregados. Os exemplos a seguir demonstram como aplicar a marca <meta>
do CSP em ambientes nãoDevelopment
.
Observação
Os exemplos nesta secção não mostram a tag completa de <meta>
para os CSPs. As tags completas de <meta>
são encontradas nas subseções da seção Aplicar a política mais acima neste artigo.
Estão disponíveis três abordagens gerais:
- Aplique o CSP por meio do componente
App
, que aplica o CSP a todos os layouts do aplicativo. - Se você 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 tag
<HeadContent>
. Para uma eficácia completa, cada arquivo de layout de aplicativo deve adotar a abordagem. - O serviço ou servidor de hospedagem pode fornecer um CSP por meio de um cabeçalho
Content-Security-Policy
adicionadas as respostas de saída de um aplicativo. Como essa abordagem varia de acordo com o serviço de hospedagem ou servidor, ela não é abordada nos exemplos a seguir. Se você deseja adotar essa abordagem, consulte a documentação do seu provedor de serviços de hospedagem ou servidor.
Blazor Web App aproxima-se
No componente App
(Components/App.razor
), injetar 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 ...>
}
Como alternativa, aplique CSPs por layout na pasta Components/Layout
, como demonstra o exemplo a seguir. Certifique-se de que cada layout especifica um CSP.
@inject IHostEnvironment Env
@if (!Env.IsDevelopment())
{
<HeadContent>
<meta ...>
</HeadContent>
}
Blazor WebAssembly abordagens de aplicativos
No componente App
(App.razor
), injetar 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>
}
Como alternativa, use o código anterior, mas aplique CSPs para cada layout na pasta Layout
. Certifique-se de que cada layout especifica um CSP.
Limitações da meta tag
Uma política de tag <meta>
não suporta as seguintes diretivas:
- antepassados-quadro
- relatório a
- Report-Uri
- de sandbox
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
Os testes ajudam a confirmar que os scripts de terceiros não são 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
ou o nome do cabeçalho de uma política baseada em cabeçalho com a etiqueta <meta>
como Content-Security-Policy-Report-Only
. Os relatórios de falhas são enviados como documentos JSON para uma URL especificada. Para obter mais informações, consulte Documentação Web MDN: Content-Security-Policy-Report-Only.
Para denunciar 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 suportado por todos os principais navegadores. Não use exclusivamente report-uri
porque o suporte para report-uri
pode ser descontinuado a qualquer momento pelos navegadores. Remova o suporte para report-uri
em suas políticas quando report-to
for totalmente suportado. Para acompanhar a adoção de report-to
, consulte Posso usar: report-to.
Teste e atualize a política de um aplicativo a cada versão.
Diagnóstico de problemas
- Os erros aparecem no console de ferramentas de desenvolvedor 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 suporta todas as diretivas incluídas. Para obter uma matriz de suporte do navegador atual, consulte Posso usar: Content-Security-Policy.