A Política de Segurança de Conteúdo (CSP) é uma ferramenta essencial para proteger aplicativos web contra ataques XSS, mas sua integração com sistemas de relatórios geralmente apresenta dificuldades. Nas versões mais recentes do FastReport .NET WEB, a arquitetura do lado do cliente foi significativamente reformulada, o que simplifica o cumprimento de uma CSP rigorosa sem perda da funcionalidade do relatório. Neste artigo, examinaremos como configurar corretamente a CSP para relatórios do FastReport e levar em consideração os riscos típicos.
A Política de Segurança de Conteúdo (CSP) é um mecanismo de segurança ou até mesmo um padrão para aplicativos web que permite controlar quais recursos (scripts, estilos, fontes, imagens, conexões, etc.) podem ser carregados e executados em uma página. A CSP é implementada por meio do cabeçalho HTTP Content-Security-Policy ou da tag meta HTML.
O principal objetivo da CSP é prevenir ataques de Cross-Site Scripting (XSS) e a introdução de código malicioso. A política proíbe a execução de scripts não assinados ou não autorizados, mesmo que um invasor consiga injetar uma tag <script> na página.
Além disso, a CSP pode:
eval() e construções semelhantes.
| DIRETIVA | FINALIDADE | VALOR DE EXEMPLO |
default-src |
Fonte padrão para todos os tipos de recursos | 'self' |
script-src |
Fontes permitidas para JavaScript | 'self' 'nonce-...' |
style-src |
Fontes permitidas para CSS | 'self' 'unsafe-inline' |
img-src |
Fontes permitidas para imagens | data: https: |
connect-src |
Endereços permitidos para fetch, XHR, WebSocket | 'self' http: ws: |
font-src |
Fontes permitidas para fontes | https://fonts.gstatic.com |
object-src |
Fontes permitidas para <object>, <embed> | 'none' |
base-uri |
Restrição da URL para a tag <base> | 'self' |
frame-ancestors |
Pais permitidos para incorporação em um iframe | 'none' |
'self' — apenas o próprio domínio (incluindo esquema e porta).'unsafe-inline' — permite scripts e estilos inline (use com cautela).'unsafe-eval' — permite eval() e construções semelhantes.'nonce-{value}' — token criptográfico de uso único.'sha256-{hash}' — hash do conteúdo do script/estilo inline.data: — permite URLs data.https: — permite qualquer fonte HTTPS.
app.Use(async (context, next) => { context.Response.Headers.ContentSecurityPolicy = "script-src 'self' 'unsafe-inline' 'unsafe-eval';style-src 'self' 'unsafe-inline'"; await next(); });
Você também pode fazer isso na marcação HTML:
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'; style-src 'self'; img-src data: https:; object-src 'none';">
Nas versões mais recentes do FastReport .NET WEB, a arquitetura do lado do cliente foi significativamente reformulada:
unsafe-inline para scripts.Observação importante sobre estilos inline em relatórios: os estilos gerados para o conteúdo das páginas do relatório (tabelas, texto, bordas) permanecem inline. Para a exibição correta do relatório, é necessário permitir unsafe-inline na diretiva style-src.
Mover JS e CSS para arquivos estáticos não apenas forneceu compatibilidade com a CSP, mas também a capacidade de substituir os estilos do WebReport sem alterar os arquivos de origem (por exemplo, por meio de um arquivo CSS adicional com maior prioridade). Além disso, o comportamento foi expandido; agora você pode conectar seus próprios scripts, substituir métodos e adicionar manipuladores. E, claro, o cache foi aprimorado – o navegador carrega o conteúdo estático apenas uma vez.
Apesar da confiabilidade da CSP, existem cenários para contorná-la. A maioria deles não está relacionada às falhas do padrão, mas a erros de implementação.
O Internet Explorer oferece suporte parcial à CSP – pode ignorar diretivas importantes. Os navegadores modernos (Chrome, Opera, Safari, Firefox) funcionam corretamente.
Solução: Não dependa apenas da CSP em navegadores desatualizados – use mecanismos de segurança adicionais.
Ao abrir um documento de texto ou imagem, o navegador pode criar automaticamente um wrapper de iframe. Esta página não possui uma CSP configurada, o que permite a execução de código malicioso.
Solução: Configure a CSP para todas as páginas geradas, incluindo recursos para download.
Os desenvolvedores geralmente protegem apenas as páginas que funcionam, esquecendo-se dos erros 404, 403, 500. Um invasor pode injetar um script em um frame com uma dessas páginas.
Solução: Aplique a CSP globalmente – por meio de middleware ou de um servidor web (Nginx, IIS, Apache).
Alguns sites usam armazenamento em nuvem (Google Drive) como fontes de conteúdo. Um invasor pode colocar um arquivo ou script malicioso lá.
Solução: Não use 'unsafe-inline' e https: em script-src se isso não for absolutamente necessário. Em vez disso, especifique domínios específicos: script-src 'self' https://trusted-cdn.com;
Assim, a nova versão do FastReport .NET WEB permite que você use relatórios com segurança em aplicativos com uma política CSP rigorosa, minimizando exceções como unsafe-inline. Ao mesmo tempo, o desenvolvedor recebe:
Implemente uma CSP rigorosa em seus projetos sem comprometer a funcionalidade dos relatórios.