Políticas de segurança e CSP
1) Para quê políticas de segurança
A frente moderna e a API dependem de várias fontes (CDN, analista, PSP, 3DS, bate-papo). Sem políticas rígidas, aumentam os riscos de XSS, clickjeking, vazamentos de dados e roubos de sessões. As políticas de segurança limitam o que é permitido por padrão ao transferir o navegador para o modelo «permitido apenas explicitamente» (allow-list).
2) Pilares básicos
O CSP (Conteúdo Security Policy) é um «menu» centralizado de fontes e comportamentos de mídia permitidos JS/CSS/mídia.
Trusted Types - proteção contra DOM-XSS no nível de tipos.
SRI (Subresource Integrity) - Controle de integridade de script/estilos.
O COP/COEP/CORP é um rígido isolamento de contextos e recursos entre as fontes.
O Fetch Metadata ('Sec-Fetch') é uma solução de servidor para filtrar solicitações de sites cruzados.
O CORS é uma política de acesso entre domínios à API.
Títulos clássicos: HSTS, 'X-Frame-Opções '/' frame-ancestors', 'Referrer-Policy', 'Persions-Policy', SameSite-cookies.
3) CSP: base e princípios
3. 1 Diretrizes (chave)
'default-src' é um default para as outras diretorias.
'script-src' são as fontes JS, nce/hash, 'trict-dinamic', 'relatório-sample'.
'style-src' - fontes CSS; minimizar 'unsafe-inline'.
`img-src`, `font-src`, `media-src`, `object-src` (обычно `none`).
'connect-src' - solicitações de rede (XHR/fetch/WebSocket).
'frame-src '/' child-src' - quadros de terceiros (PSP, 3DS).
'frame-ancestors' - quem pode incorporar o nosso site (anti-clickjeking).
'base-uri' é uma proibição de troca '<base>'.
'forma-action' - onde os formulários são permitidos.
'upgrade-insecure-requests',' block-all-mixed-conteúdo '- luta contra o mix HTTP/HTTPS.
'relatório-uri '/' relatório-to' - para onde enviar as violações.
3. 2 Nonce и hash
Abordagem Nonce: Por cada resposta HTTP, gerar 'nonce' criptoclasta, adicionar '<script nonce =' a 'e em' script-src '...' a inline.
Abordagem hash: hash fixo de conteúdo inline. Adequado para HTML estático, desconfortável na dinâmica.
'trict-dinamic': Confira apenas nos violinos carregados com o script 'confiável' (com nance/hash). Remove a necessidade de listar domínios de destino no download dinâmico, mas requer navegadores modern.
3. 3 Proibição 'unsafe-'
Evitar 'unsafe-inline', 'unsafe-eval'. Se o quadro exigir eval (por exemplo, fonte-map em dave), só deve ser incluído em dave.
Para estilos, use 'nonce' ou 'hash', sempre que possível, sem Inline.
3. 4 Exemplo de CSP rigoroso (referência de combate)
Content-Security-Policy:
default-src 'none';
base-uri 'self';
object-src 'none';
script-src 'self' 'nonce-{RANDOM}' 'strict-dynamic' https://www. googletagmanager. com;
style-src 'self' 'nonce-{RANDOM}';
img-src 'self' data: https://images. example-cdn. com;
font-src 'self' https://fonts. gstatic. com;
connect-src 'self' https://api. example. com wss://ws. example. com;
frame-src https://3ds. psp. com https://pay. psp. com;
frame-ancestors 'none';
form-action 'self' https://pay. psp. com;
upgrade-insecure-requests;
report-to csp-endpoint; report-sample
4) Trusted Types (DOM-XSS)
Selecione a diretriz «Conteúdo-Segurança-Policy: require-trusted-types-for 'script»; trusted-types app default`.
Crie uma única política no código ('window. trustedTypes. createPolicy('app', { createHTML() {... } })`).
Proíba atribuições não seguras ('element. innerHTML =...`) без Trusted Types.
Integração com quadros (React/Angular/Vue): Use API de renderização segura e evite dangerouslySetInnerHTML perigosas.
5) SRI (integridade do CDN)
Para os '<script> '/' <link>' externos, use 'integrity =' sha256- '... crossorigin =' anonymous '.
O SRI complementa e não substitui o CSP. Atualizando a versão CDN - Atualize o hash.
6) Clickjeking e quadros
O método moderno é 'frame-ancestors' (substituindo o antiquado 'X-Frame-Opções').