feat(security): CSP ganha script-src (auditoria: CSP ainda sem script-src)

'self' 'unsafe-inline' https://cdn.jsdelivr.net — levantamento antes
de mexer: só um host externo carrega <script> a sério (jsdelivr, o
html2canvas de views/admin/horario/instagram.php e o bootstrap-icons
da página de erro); tudo o resto (Bootstrap, jQuery, Summernote) já é
vendorizado desde a migração de 25/09. 'unsafe-inline' fica por sítio
ter vários <script> inline (tema claro/escuro, GA-like snippets) que
não valia a pena reescrever para nonce/hash nesta passagem — mas isto
já bloqueia o caso que mais importa: um <script src="outro-domínio">
injetado por uma falha de XSS deixa de carregar.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
andreandClaude Sonnet 5 committed 2026-09-25 22:10:26 +01:00
1 parent 7482dc98f2
commit 231b8eb699
1 file changed
+7 -4
+7 -4
View File
@@ -26,15 +26,18 @@ RewriteRule "^shared/platform-tools/[^/]+\.php$" - [F,L]
RewriteRule "\.md$" - [F,L]
# ── Headers de segurança ─────────────────────────────────────────────────────
# A CSP não restringe scripts ainda (o site tem scripts inline e incorporações
# da Google); fecha o que não parte nada: quem pode meter o site num iframe,
# <base>, plugins e para onde os formulários podem enviar.
# script-src: 'self' (todo o JS próprio, incl. Bootstrap/jQuery/Summernote
# vendorizados desde 25/09) + 'unsafe-inline' (o site tem vários <script>
# inline — remover isso é reescrever cada um para nonce/hash, não cabe aqui)
# + cdn.jsdelivr.net (html2canvas em views/admin/horario/instagram.php,
# bootstrap-icons na página de erro). Já bloqueia o que importa: um
# <script src="https://outro-dominio/..."> injetado não carrega.
<IfModule mod_headers.c>
Header always set X-Content-Type-Options "nosniff"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=(), usb=()"
Header always set Content-Security-Policy "frame-ancestors 'self'; base-uri 'self'; object-src 'none'; form-action 'self' https://forms.zohopublic.eu"
Header always set Content-Security-Policy "frame-ancestors 'self'; base-uri 'self'; object-src 'none'; form-action 'self' https://forms.zohopublic.eu; script-src 'self' 'unsafe-inline' https://cdn.jsdelivr.net"
</IfModule>
# ── Canonical host: force HTTPS + strip www ───────────────────────────────────