Security Headers: cabeçalhos de segurança e CSP para PrestaShop 8 e 9
Instalar e configurar o Security Headers: modo de teste, CSP e violações, nonce e nota A+, HSTS, Permissions-Policy, scanner, alertas e histórico.
O DataFirefly Security Headers envia os cabeçalhos de segurança HTTP a partir do PrestaShop 8 e 9: Content-Security-Policy, HSTS, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy e Cross-Origin-Opener-Policy. O módulo configura-se em Parâmetros avançados > Cabeçalhos de segurança, organizado em seis separadores: Painel, Geral e modo de teste, Content-Security-Policy, HSTS e outros cabeçalhos, Permissions-Policy e Violações CSP.
Instalação
- Em Módulos > Gestor de módulos, clique em Carregar um módulo e envie o ficheiro ZIP.
- O módulo instala-se em modo de teste, com a CSP em Report-Only e a recolha de violações ativa: nenhum visitante é bloqueado.
- Abra Parâmetros avançados > Cabeçalhos de segurança. A ligação Configurar do gestor de módulos leva ao mesmo sítio.
Passagem a produção, passo a passo
A lista Passagem a produção do painel segue estes passos e mostra o seu estado.
- Indique os seus dispositivos de teste. Separador Geral e modo de teste: clique em Adicionar o meu endereço IP, ou copie a ligação de teste e abra-a no telemóvel.
- Marque os serviços que usa no separador Content-Security-Policy, bloco Serviços de terceiros.
- Percorra a loja a partir de um dispositivo de teste: página inicial, categoria, página de produto, carrinho, processo de compra até ao pagamento, conta de cliente. As violações aparecem no separador Violações CSP em poucos minutos.
- Trate as violações: permita as fontes legítimas e ignore as restantes.
- Mude a CSP para Aplicar quando não surgir nenhuma violação nova durante 24 horas.
- Clique em Pré-visualizar produção no painel para ver a nota sem modo de teste e depois desative o modo de teste.
- Confirme num scanner público como securityheaders.com ou Mozilla Observatory, depois de limpar a cache do CDN, se usar um.
O modo de teste
Enquanto o modo de teste estiver ativo, cada pedido recebe um destes tratamentos:
- Dispositivos de teste (IP da lista ou navegador aberto com a ligação de teste): todos os cabeçalhos, CSP aplicada seja qual for o modo escolhido, HSTS limitado a 5 minutos e sem preload.
- Outros visitantes: apenas a CSP em Report-Only, se a recolha de violações estiver ativa. Nada é bloqueado, mas os navegadores indicam o que seria.
Depois de desativar o modo de teste, todos os visitantes recebem a configuração completa.
A lista de IP aceita endereços IPv4 e IPv6 e intervalos CIDR, um por linha. A ligação de teste marca o navegador que a abre como dispositivo de teste durante 24 horas, útil para um telemóvel em 4G cujo IP muda. Abra o mesmo endereço com ?dfsh_test=off para parar mais cedo. Criar uma nova ligação invalida as ligações anteriores.
A opção Aplicar ao back-office envia HSTS, X-Frame-Options em SAMEORIGIN, X-Content-Type-Options e Referrer-Policy no back-office. A CSP e a Permissions-Policy nunca são aplicadas aí.
Content-Security-Policy
Diretivas
Cada diretiva aceita fontes separadas por espaços ou quebras de linha: palavras-chave ('self', 'none', 'unsafe-inline', 'unsafe-eval'), anfitriões (https://www.example.com, *.example.com), esquemas (data:, https:), nonces e hashes. As aspas em falta à volta das palavras-chave são adicionadas. Um valor inválido é descartado e assinalado ao guardar. Uma diretiva de carregamento vazia recorre a default-src; as restantes diretivas vazias não são enviadas.
Serviços de terceiros
Cada serviço marcado adiciona os seus domínios às diretivas necessárias, sem alterar as suas entradas: Google Analytics 4 e Tag Manager, Google Ads, Google Fonts, reCAPTCHA, Google Maps, YouTube, Vimeo, Meta Pixel, TikTok, Pinterest, Stripe, PayPal, Mollie, Cookiebot, Axeptio, Hotjar, Microsoft Clarity, Trustpilot e Crisp. Os fornecedores mudam por vezes de domínio: consulte o separador de violações depois de ativar um serviço.
Opções
- Incluir os servidores de multimédia: adiciona os servidores definidos em Parâmetros avançados > Desempenho às diretivas de imagens, scripts, estilos, tipos de letra e multimédia.
- Atualizar pedidos inseguros: envia
upgrade-insecure-requestsem modo Aplicar, numa loja em https. - URLs excluídos da CSP: um fragmento de URL por linha. A CSP não é enviada quando o endereço pedido contém um deles, por exemplo uma página de regresso do pagamento problemática.
Nonce e a nota A+
A configuração predefinida mantém 'unsafe-inline' em script-src, porque os temas PrestaShop usam scripts inline. Os scanners limitam então a nota a A. Para procurar o A+:
- No bloco CSP estrita com nonce, ative Adicionar um nonce aos scripts com o modo de teste ativo.
- O módulo gera um nonce aleatório em cada página, adiciona-o a todas as etiquetas
<script>e remove'unsafe-inline'descript-src. - Percorra a loja e trate as violações. Os scripts inseridos depois por JavaScript sem nonce aparecem no registo, por exemplo as etiquetas HTML personalizadas do Google Tag Manager, que devem usar a variável nonce do GTM.
- Quando o registo já não mostrar violações
eval, remova'unsafe-eval'descript-src.
A opção Manter os manipuladores de eventos inline adiciona script-src-attr 'unsafe-inline' para que os atributos onclick continuem a funcionar. Mantenha-a ativa, a menos que o tema e os módulos não os usem; alguns scanners públicos assinalam-na.
Para programadores: o nonce da página está disponível no Smarty como {$dfsh_nonce} e em PHP com DfSecurityHeaders::getNonce(). É adicionado automaticamente às etiquetas script da saída HTML; estes acessos servem para código produzido fora dessa saída.
Registo de violações
Os relatórios dos navegadores são agrupados por diretiva e fonte bloqueada, com o número de ocorrências, a data do último aviso, uma página de exemplo e, para código inline, os seus primeiros caracteres. As extensões do navegador são ignoradas. Os URLs são guardados sem parâmetros e nenhum IP é conservado.
- Permitir adiciona a fonte à diretiva em causa. Se a diretiva estava vazia, recebe primeiro as fontes de
default-src. - Ignorar remove a linha sem alterar a CSP.
- As caixas de seleção permitem Permitir a seleção ou Ignorar a seleção. Os botões de diretiva e o campo de pesquisa filtram a lista.
Permitir uma violação inline ou eval adiciona 'unsafe-inline' ou 'unsafe-eval', o que enfraquece a política: é preferível mover o script para um ficheiro. Com o nonce ativo, os scripts inline sem nonce não podem ser permitidos automaticamente. As violações não vistas há 30 dias são eliminadas automaticamente.
HSTS e outros cabeçalhos
- HSTS: duração de 5 minutos a 2 anos, 1 ano por predefinição. Os navegadores memorizam o cabeçalho durante todo esse tempo e recusam http.
includeSubDomainsforça https em todos os subdomínios: ative apenas se todos o suportarem.preloadsó é enviado comincludeSubDomainse pelo menos 1 ano; submeta o domínio a hstspreload.org apenas se tiver a certeza, a remoção demora meses. - X-Frame-Options: recomenda-se SAMEORIGIN; DENY também bloqueia os iframes da sua própria loja.
- X-Content-Type-Options: envia
nosniff. - Referrer-Policy:
strict-origin-when-cross-originpor predefinição. - Cross-Origin-Opener-Policy: desativada por predefinição;
same-origin-allow-popupsmantém a funcionar as janelas de pagamento do PayPal. - Remover o cabeçalho X-Powered-By oculta a versão do PHP exposta por alguns servidores.
Permissions-Policy
Para cada uma das 19 funcionalidades: Bloqueado desativa-a em todo o lado, Apenas este site permite-a no seu domínio e nas origens adicionais indicadas, Todos os sites abre-a, Não definido mantém o comportamento do navegador. As funcionalidades de que uma loja não precisa (câmara, microfone, geolocalização, sensores, USB…) estão bloqueadas por predefinição, e payment está limitado ao site. O serviço Stripe adiciona a sua própria origem a payment.
Scanner e nota
Analisar os cabeçalhos atuais pede uma página da loja a partir do servidor e mostra a nota, o detalhe por cabeçalho, as fugas de informação e os cabeçalhos em bruto. Só os domínios da loja podem ser analisados. Pré-visualizar produção simula a configuração sem modo de teste. A nota segue a mesma ponderação dos scanners públicos e é indicativa. A última análise e o histórico de notas continuam visíveis depois de recarregar.
Alertas de bloqueio
No separador Geral e modo de teste, ative os Alertas por email e indique até 5 destinatários. Com a CSP aplicada e o modo de teste desativado, cada recurso realmente bloqueado que nunca tinha sido visto gera um email com a diretiva, a fonte e a página. As novidades são agrupadas, no máximo um email por hora. Enviar um email de teste verifica a configuração; se nada chegar, verifique Parâmetros avançados > Email.
Histórico, exportação e importação
Cada alteração guarda as definições anteriores, com a data, o funcionário e as diferenças face ao estado atual. São guardadas as 15 últimas versões; Restaurar volta a uma delas, e o estado substituído passa para o histórico.
Transferir as definições gera um ficheiro JSON sem os tokens secretos, para importar noutra loja, por exemplo da pré-produção para a produção. Uma importação ativa sempre o modo de teste. Os IP de teste também são importados: verifique-os.
Cache, CDN e cabeçalhos do servidor
- Um CDN ou uma cache de página pode servir cabeçalhos antigos: limpe-a após cada alteração.
- Se o seu alojamento ou o Cloudflare já adiciona alguns cabeçalhos, o scanner assinala os duplicados. Remova-os no servidor ou desative o cabeçalho no módulo.
- Para que o servidor trate dos cabeçalhos, copie o bloco Apache ou Nginx do painel e depois desative o módulo. O envio de violações e o nonce, que dependem do módulo, não estão incluídos.
Em caso de problema
- Uma página deixou de funcionar: restaure a versão anterior no histórico, ou volte a pôr a CSP em Report-Only enquanto corrige.
- Desligar tudo: desative Enviar os cabeçalhos de segurança no separador Geral, ou desative o módulo.
- HSTS: um navegador que recebeu HSTS recusa http até a duração expirar, mesmo depois de o módulo ser desativado. É por isso que os dispositivos de teste recebem apenas 5 minutos.