Skip to main content
Validação HTML

Valor inválido “X” para o atributo “sandbox” no elemento “iframe”: Definir tanto “allow-scripts” como “allow-same-origin” não é recomendado, porque efetivamente permite que uma página incorporada escape de todas as restrições do sandbox.

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:

  1. 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.

  2. 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.

  3. 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 sandbox não oferece nenhum benefício significativo de segurança, e pode querer usar outros mecanismos de segurança como cabeçalhos Content-Security-Policy em 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.

Ajude-nos a melhorar os nossos guias

Este guia foi útil?

Pronto para validar os seus sites?
Comece o seu teste gratuito hoje.