Security Headers

Security headers HTTP representam uma camada fundamental e frequentemente subutilizada de defesa para aplicações web modernas, funcionando como diretivas que instruem os navegadores a ativar mecanismos de proteção nativos contra uma ampla gama de vetores de ataque comuns. Estes cabeçalhos de resposta HTTP agem como uma política de segurança declarativa, estabelecendo regras sobre como o navegador deve processar e renderizar o conteúdo da página, controlar a execução de scripts, gerenciar cookies, e interagir com recursos de terceiros. Quando configurados adequadamente, headers como Content-Security-Policy (CSP), Strict-Transport-Security (HSTS), X-Frame-Options e X-Content-Type-Options criam barreiras significativas contra ataques de Cross-Site Scripting (XSS), clickjacking, MIME sniffing, downgrade de protocolo e injeção de código malicioso. A implementação correta desses cabeçalhos representa uma das formas mais eficientes de hardening de aplicações web, pois não requer mudanças no código da aplicação e oferece proteção imediata contra classes inteiras de vulnerabilidades. Estudos mostram que a grande maioria dos sites ainda não implementa adequadamente esses headers, deixando seus usuários expostos a ataques que poderiam ser mitigados com configurações relativamente simples no servidor web. Esta negligência é especialmente crítica considerando que ferramentas automatizadas de scanning de segurança avaliam a presença e configuração adequada desses headers como indicadores primários da postura de segurança de uma aplicação.

Content-Security-Policy (CSP)

CSP previne XSS definindo whitelist de fontes confiáveis para scripts, styles, images e outros recursos.

      # CSP Strict (recomendado)
      Content-Security-Policy:
      default-src 'self';
      script-src 'self' 'nonce-';
      style-src 'self' 'nonce-';
      img-src 'self' https: data:;
      font-src 'self';
      connect-src 'self' https://api.example.com;
      frame-ancestors 'none';
      base-uri 'self';
      form-action 'self';
      # CSP com report-only (testing mode)
      Content-Security-Policy-Report-Only:
      default-src 'self';
      report-uri /csp-violation-report
      

CSP Directives Críticas

  • default-src: Fallback para outras directives
  • script-src: Whitelist para JavaScript execution
  • style-src: CSS sources permitidas
  • frame-ancestors: Previne clickjacking
  • upgrade-insecure-requests: Force HTTPS

Strict-Transport-Security (HSTS)

HSTS força browsers a sempre usar HTTPS, prevenindo downgrade attacks e SSL stripping.

      # HSTS com preload e subdomains
      Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
      # Passos para HSTS preload:
      1. Configurar HSTS header com preload
      2. Submeter domínio em hstspreload.org
      3. Domain será incluído em browser preload lists
      

X-Frame-Options

Previne clickjacking controlando se página pode ser renderizada em frame/iframe.

      # Deny all framing (mais seguro)
      X-Frame-Options: DENY
      # Allow only same origin
      X-Frame-Options: SAMEORIGIN
      # Allow specific domain (deprecated - use CSP frame-ancestors)
      X-Frame-Options: ALLOW-FROM https://trusted.com
      

X-Content-Type-Options

Previne MIME sniffing attacks forçando browser a respeitar Content-Type declarado.

      # Disable MIME sniffing
      X-Content-Type-Options: nosniff
      

Referrer-Policy

Controla quanto de referrer information é enviado em requests.

      # Recommended policy
      Referrer-Policy: strict-origin-when-cross-origin
      # Options:
      # - no-referrer: Never send referrer
      # - no-referrer-when-downgrade: No referrer on HTTPS→HTTP
      # - same-origin: Only send to same origin
      # - strict-origin: Only send origin (no path)
      

Permissions-Policy

Controla quais browser features e APIs a página pode usar (substitui Feature-Policy).

      # Disable dangerous features
      Permissions-Policy:
      geolocation=(),
      microphone=(),
      camera=(),
      payment=(),
      usb=(),
      interest-cohort=()
      

Configuração por Servidor

Nginx

      # nginx.conf
      add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
      add_header X-Frame-Options "DENY" always;
      add_header X-Content-Type-Options "nosniff" always;
      add_header Referrer-Policy "strict-origin-when-cross-origin" always;
      add_header Content-Security-Policy "default-src 'self';" always;
      add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always;
      

Apache

      # .htaccess or httpd.conf
      Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
      Header always set X-Frame-Options "DENY"
      Header always set X-Content-Type-Options "nosniff"
      Header always set Referrer-Policy "strict-origin-when-cross-origin"
      Header always set Content-Security-Policy "default-src 'self';"
      

Node.js/Express

      // Use Helmet middleware
      const helmet = require('helmet');
      app.use(helmet());
      // Custom configuration
      app.use(helmet.contentSecurityPolicy({
      directives: {
      defaultSrc: ["'self'"],
      scriptSrc: ["'self'", "'nonce-'"],
      styleSrc: ["'self'", "'nonce-'"],
      }
      }));
      

Testing Security Headers

  • securityheaders.com: Scan e grade A+ rating
  • Mozilla Observatory: Comprehensive analysis
  • Chrome DevTools: Network tab → Headers
  • curl: curl -I https://example.com

Common Pitfalls

  • CSP muito permissivo com 'unsafe-inline' e 'unsafe-eval'
  • HSTS sem includeSubDomains deixa subdomains vulneráveis
  • Headers configurados mas não aplicados (always flag missing)
  • Testar apenas homepage - headers devem estar em todas as páginas

Checklist Completo

  • [OK] Content-Security-Policy strict configurado
  • [OK] HSTS com max-age 1 ano + includeSubDomains
  • [OK] X-Frame-Options: DENY ou CSP frame-ancestors
  • [OK] X-Content-Type-Options: nosniff
  • [OK] Referrer-Policy configurado
  • [OK] Permissions-Policy desabilitando features não usadas
  • [OK] Headers testados em securityheaders.com (A+ rating)
  • [OK] CSP testado com report-only mode primeiro