# config/initializers/content_security_policy.rb # # Content Security Policy (CSP) — defesa em profundidade contra XSS, # clickjacking e injeção de recursos externos. # # ✅ MODO ENFORCING (bloqueia de verdade) # A política abaixo BLOQUEIA recursos fora da allowlist. Foi validada no # ambiente de teste (o login não gera violações de CSP no console) e a allowlist # cobre todos os CDNs usados pelo app: mapa (Leaflet + tiles ArcGIS/OSM), # gráficos (Chart.js), date-picker (Flatpickr), Tailwind e Google Fonts. # # ⚠️ APÓS PUBLICAR, VALIDE LOGADO: abra /operacoes (painel com mapa/gráficos), # o dashboard e as telas de motorista, com o console (F12) aberto. Se algum # recurso for "Refused to load", adicione o host ao diretivo correspondente # abaixo. Para reverter rapidamente sem remover a política, volte a última linha # para `= true` (modo report-only, que só avisa e não bloqueia). # Rails.application.configure do config.content_security_policy do |p| p.default_src :self p.base_uri :self p.object_src :none p.frame_ancestors :self # anti-clickjacking (reforça X-Frame-Options) p.form_action :self # Scripts do app (self/inline) + CDNs usados: # cdn.tailwindcss.com → Tailwind (Play CDN, precisa de eval p/ o JIT) # cdn.jsdelivr.net → Chart.js, Flatpickr # unpkg.com → Leaflet, Leaflet.heat p.script_src :self, :unsafe_inline, :unsafe_eval, "https://cdn.tailwindcss.com", "https://cdn.jsdelivr.net", "https://unpkg.com" # Estilos inline (Tailwind/estilos embutidos) + Google Fonts + CSS dos CDNs p.style_src :self, :unsafe_inline, "https://fonts.googleapis.com", "https://cdn.jsdelivr.net", "https://unpkg.com" p.font_src :self, :data, "https://fonts.gstatic.com" # Imagens: data/blob (QR base64, canvas dos gráficos), ícones do Leaflet, # tiles do mapa (ArcGIS World Imagery + OpenStreetMap) e as FOTOS DA FACHADA # do popup do mapa de operações — hospedadas no S3 do SimpliRoute # (ex.: simpli-visit-images.s3.amazonaws.com). Sem o host da Amazon o CSP # enforcing bloqueava a foto ("Refused to load the image ... img-src"). p.img_src :self, :data, :blob, "https://unpkg.com", "https://cdn.jsdelivr.net", "https://server.arcgisonline.com", "https://*.tile.openstreetmap.org", "https://*.amazonaws.com" p.connect_src :self end # Bloqueio ativo. Para reverter para "apenas reportar" (sem bloquear), volte # para `= true` — veja as instruções no topo deste arquivo. config.content_security_policy_report_only = false end