Pular para o conteúdo

Controles de Segurança

Todos os 15 controles foram implementados e verificados. Nenhum pendente.

#ControleStatusDetalhes
1HSTSImplementadomax-age=31536000; includeSubDomains
2CSPImplementadoWhitelist: Turnstile, Maps, Tailwind, VTEX, Azure, AirOps
3X-Frame-OptionsImplementadoDENY — impede framing/clickjacking
4X-Content-Type-OptionsImplementadonosniff — impede MIME sniffing
5Referrer-PolicyImplementadostrict-origin-when-cross-origin
6Permissions-PolicyImplementadocamera=(), microphone=(), geolocation=(self)
7Rate Limit (Auth)Implementado5/15min login, 3/h register, 10/15min guest
8Rate Limit (Internal)Implementado100/min por IP
9CORSImplementadoRestrito a profarma.dev domains
10JWT HttpOnly CookieImplementadoSecure, SameSite=Lax, 12h TTL
11Turnstile Anti-BotImplementadoLogin, guest verify, app access
12RBAC (isAdmin)ImplementadorequireAdminAuth em todas as rotas admin
13Error SanitizationImplementadoZero err.message em responses 500
14Debug EndpointsImplementadoRemovidos (/test-vtex, /debug-sync)
15Debug HeadersImplementadoZero x-debug-*, x-profarma-*

Todos os responses incluem os seguintes headers:

Strict-Transport-Security: max-age=31536000; includeSubDomains
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: camera=(), microphone=(), geolocation=(self)
Content-Security-Policy: default-src 'self'; script-src 'self' https://challenges.cloudflare.com ...; [truncated]

A CSP permite apenas origens necessárias:

DiretivaOrigens Permitidas
default-src'self'
script-src'self', challenges.cloudflare.com
style-src'self', 'unsafe-inline', CDN Tailwind
img-src'self', data:, VTEX CDN
connect-src'self', *.profarma.dev, Azure AD, VTEX, AirOps
frame-srcchallenges.cloudflare.com
font-src'self', Google Fonts

Implementado em memória (per-isolate), com contadores por IP:

EndpointLimiteJanelaResposta
POST /auth/login515 min429 Too Many Requests
POST /auth/register31 hora429
GET/POST /auth/guest/verify1015 min429
Internal API (X-Internal-API-Key)1001 min429

Apenas 4 domínios corporativos permitem cross-origin:

  • profarma.dev
  • profarma.com.br
  • grupoprofarma.com.br
  • reded1000.com.br
PropriedadeValor
AlgoritmoHMAC-SHA256
SecretAUTH_SECRET (64 chars, crypto-random)
TTL12 horas
Cookie nameprofarma_session
HttpOnlySim
SecureSim
SameSiteLax
RoleVerificaçãoAcesso
AdminrequireAdminAuth (email in admin_emails)Todas as rotas
UserJWT válidoApps publicados + Turnstile
GuestJWT guest + allowedAppsApenas apps do convite
  • Responses 500 retornam { error: "Internal server error" }nunca o err.message original
  • Stack traces removidos em produção
  • Zero informação de debug em qualquer response de erro

Os seguintes endpoints de debug foram identificados e removidos durante o hardening:

  • /test-vtex — removido
  • /debug-sync — removido
  • /api/debug/* — removido
  • Zero headers x-debug-* em qualquer response
  • Zero headers x-profarma-* em qualquer response
  • Zero headers revelando stack/versão (exceto cf-* do Cloudflare — gerenciados por eles)

Além dos controles implementados no Worker, o Cloudflare fornece:

RegraStatus
OWASP Core Rule SetAtivo
Cloudflare Managed RulesAtivo
Bot Fight ModeAtivo
DDoS ProtectionAtivo
TLS 1.3 (ZRT)Ativo
TLS Minimum 1.2Enforced
Always Use HTTPSAtivo