Sobre este problema HTML
O atributo sandbox é uma das funcionalidades de segurança mais poderosas disponíveis para elementos <iframe>. Quando presente sem valor (ou com tokens específicos), aplica um conjunto rigoroso de restrições ao conteúdo incorporado — bloqueando scripts, submissões de formulários, popups, acesso same-origin, e mais. Você relaxa seletivamente essas restrições adicionando tokens separados por espaços como allow-scripts, allow-forms, ou allow-popups.
O problema surge especificamente quando allow-scripts e allow-same-origin são usados em conjunto. O token allow-scripts permite que a página incorporada execute JavaScript, enquanto allow-same-origin permite que mantenha a sua origem original (em vez de ser tratada como vindo de uma origem única e opaca). Com ambos ativados, o JavaScript da página incorporada pode aceder ao DOM da página pai via window.parent (se partilharem a mesma origem) ou, mais criticamente, pode usar JavaScript para remover programaticamente o atributo sandbox do seu próprio elemento <iframe>. Uma vez que o atributo é removido, todas as restrições do sandboxing são levantadas, tornando o atributo sandbox completamente inútil.
É por isso que o validador W3C sinaliza esta combinação — não é tecnicamente HTML inválido, mas é um anti-padrão de segurança que torna o sandboxing ineficaz. A especificação HTML do WHATWG avisa explicitamente contra esta combinação pela mesma razão.
Como corrigir
A correção depende do que o conteúdo incorporado realmente precisa:
-
Se a página incorporada precisa de scripts mas não de acesso same-origin: Remova
allow-same-origin. A página ainda pode executar JavaScript mas será tratada como uma origem única, impedindo-a de aceder a cookies, armazenamento, ou ao DOM da frame pai. -
Se a página incorporada precisa de acesso same-origin mas não de scripts: Remova
allow-scripts. A página mantém a sua origem mas não pode executar qualquer JavaScript. -
Se acredita que ambos são necessários: Reconsidere se o sandboxing é a abordagem correta. Se o conteúdo incorporado realmente precisa tanto de execução de scripts como de acesso same-origin, o atributo
sandboxnão oferece nenhum benefício significativo de segurança, e pode querer usar outros mecanismos de segurança como cabeçalhosContent-Security-Policyem vez disso.
Siga sempre o princípio do menor privilégio — conceda apenas as permissões que o conteúdo incorporado estritamente requer.
Exemplos
❌ Mau: usar tanto allow-scripts como allow-same-origin
<iframe
src="https://example.com/widget"
sandbox="allow-scripts allow-same-origin">
</iframe>
Isto desencadeia o aviso do validador porque a página incorporada pode usar o seu acesso a scripts combinado com a sua origem preservada para escapar completamente do sandbox.
❌ Mau: ambas as flags presentes juntamente com outros tokens
<iframe
src="https://example.com/widget"
sandbox="allow-forms allow-scripts allow-same-origin allow-popups">
</iframe>
Mesmo com tokens adicionais, a presença de ambos allow-scripts e allow-same-origin ainda anula o sandbox.
✅ Bom: permitir scripts sem acesso same-origin
<iframe
src="https://example.com/widget"
sandbox="allow-scripts">
</iframe>
A página incorporada pode executar JavaScript mas é tratada como uma origem opaca única, impedindo-a de aceder a recursos da página pai ou de remover o seu próprio sandbox.
✅ Bom: permitir apenas as permissões necessárias
<iframe
src="https://example.com/widget"
sandbox="allow-scripts allow-forms allow-popups">
</iframe>
Isto concede execução de scripts, submissão de formulários e capacidades de popup mantendo o conteúdo em sandbox numa origem única.
✅ Bom: usar um sandbox vazio para máxima restrição
<iframe
src="https://example.com/widget"
sandbox="">
</iframe>
Um atributo sandbox vazio aplica todas as restrições — sem scripts, sem submissões de formulários, sem popups, sem acesso same-origin, e mais. Esta é a opção mais segura quando o conteúdo incorporado é puramente estático.
✅ Bom: remover o sandbox quando não oferece benefício real
<iframe
src="https://example.com/widget"
title="Example widget">
</iframe>
Se genuinamente precisa tanto de execução de scripts como de acesso same-origin, é mais honesto omitir completamente sandbox e confiar noutras medidas de segurança, em vez de incluir um atributo que oferece uma falsa sensação de segurança.
Encontre problemas como este automaticamente
O Rocket Validator analisa milhares de páginas em segundos, detetando problemas HTML em todo o seu site.
Saiba mais: