Também disponível em: English · Español · Français · العربية
Atributo sandbox do iframe: monte e entenda o que ele faz de verdade
Os treze tokens, as quatro regras para combiná-los e a condição que todo mundo corta do famoso aviso.
O que é o atributo sandbox de um iframe?
O atributo sandbox coloca o conteúdo de um iframe sob um conjunto de restrições extras. Escreva-o sem valor e a página emoldurada recebe o tratamento mais restritivo que existe: scripts não rodam, formulários não são enviados, pop-ups e caixas de diálogo ficam bloqueados, e o conteúdo é tratado como vindo de uma origem opaca única, então não alcança nada seu. Cada token que você acrescenta devolve uma dessas capacidades.
São exatamente treze tokens, e o padrão HTML os lista numa única frase. Isso importa mais do que parece: navegadores ignoram valores de atributo que não reconhecem, então uma invenção plausível não concede nada e também não avisa. O valor é ainda um conjunto de tokens únicos e sem ordem, insensível a maiúsculas ASCII: a ordem nunca importa, ALLOW-SCRIPTS é o mesmo que allow-scripts, e escrever um token duas vezes não é conforme mesmo sem mudar nada.
Este montador marca os tokens, escreve o atributo e depois lê a combinação de volta para você — que é justamente a parte que as listas de caixinhas por aí deixam de fora, porque várias das regras tratam de tokens interagindo e não de tokens isolados.
Como usar
- Marque as capacidades de que o conteúdo realmente precisa. Cada token traz uma linha dizendo o que ele reabilita e, depois que a página carrega, uma nota sobre se o seu próprio navegador o reconhece. Os botões de exemplo carregam cinco casos reais, incluindo o exemplo do próprio padrão.
- Diga de onde vem a página emoldurada. Mesma origem, origem diferente, ou você não pode garantir. Esta é a pergunta que decide se o famoso aviso sobre allow-scripts junto de allow-same-origin vale para você, e é a única coisa que um validador não tem como saber.
- Leia os achados e copie a tag. Os achados vêm em quatro tipos: marcação que não é conforme, uma saída do sandbox, tokens que não fazem nada naquela combinação, e notas simples. Se o seu iframe estiver dentro de outro com sandbox, cole o atributo daquele quadro na caixa de aninhamento para ver o que sobrevive.
O aviso que todos repetem e a cláusula que somem com ela
O conselho que você já ouviu é: nunca use allow-scripts e allow-same-origin juntos. O que o padrão diz é que usar os dois “quando a página incorporada tem a mesma origem da página que contém o iframe permite que a página incorporada simplesmente remova o atributo sandbox e se recarregue, saindo do sandbox por completo”.
A cláusula do meio é que sustenta tudo. A fuga não tem mistério: é que um script de mesma origem dentro do quadro alcança o documento que o contém, apaga o atributo e recarrega. Uma página de outra origem não encosta nesse documento, então não tem como fazer o truque. O exemplo do próprio padrão é um iframe com sandbox valendo allow-same-origin, allow-forms e allow-scripts em volta de um mapa de terceiros, e ele descreve esse sandbox como “ainda útil”, porque pop-ups e plugins continuam bloqueados.
A regra honesta é então mais estreita e mais útil que a versão popular: o par é uma porta de saída quando você emoldura algo que você mesmo serve, e uma configuração razoável quando emoldura a origem de outra pessoa. Se não puder garantir qual dos dois casos é — um redirecionamento pode levar uma URL de outra origem para a sua — convém supor que a fuga está disponível, que é exatamente por que o validador do W3C avisa sobre o par sem condições. É um padrão sensato, não uma afirmação sobre o seu caso.
As regras que uma lista de caixinhas não conta
Duas combinações não são marcação conforme. allow-top-navigation e allow-top-navigation-by-user-activation não devem ser especificados juntos, porque é redundante: só o incondicional tem efeito. E allow-top-navigation-to-custom-protocols não deve ser especificado ao lado de allow-top-navigation nem de allow-popups, pelo mesmo motivo. Enviando os dois casos ao validador Nu do W3C, o primeiro volta como erro e sobre o segundo ele não diz absolutamente nada, em nenhuma das duas formas — ou seja, uma das duas regras não é aplicada pela ferramenta com que a maioria conferiria.
Dois tokens também podem ser completamente inertes. allow-modals não faz nada sozinho: o padrão diz que alert, confirm e prompt precisam de allow-modals e de allow-same-origin, e que a URL carregada tem de ser da mesma origem que a página de nível superior. allow-popups-to-escape-sandbox governa o que uma janela aberta pelo conteúdo herda, então sem allow-popups não há janela para governar. Nenhum dos dois é erro, então nenhum validador os menciona: você simplesmente fica com um token que parece fazer algo.
O aninhamento só aperta. O padrão trabalha um exemplo em que uma página emoldura outra com allow-same-origin e allow-forms, e essa emoldura uma terceira com allow-scripts: a mais interna não recebe nada, porque “o iframe em A está com scripts desativados, e isso prevalece sobre a palavra-chave allow-scripts posta no iframe em B”. Um quadro interno pode estreitar o que recebeu; nunca pode devolver algo que um quadro externo reteve.
Por fim, as flags travam na navegação. “Estas flags só entram em vigor quando o content navigable do elemento iframe é navegado. Removê-las, ou remover o atributo sandbox inteiro, não tem efeito sobre uma página já carregada.” Mudar o atributo por script não faz nada até algo recarregar, e é por isso que o padrão desaconselha fazê-lo.
Limites honestos
Esta ferramenta lê um atributo; não audita uma página. Ela não enxerga o seu Content-Security-Policy, que pode impor um sandbox próprio pela diretiva sandbox, nem enxerga o atributo allow, que é um mecanismo separado e trata de permissões em vez de restrições. Ela também acredita no que você disser sobre a origem da página emoldurada, porque é a única forma de saber isso de antemão.
A nota de suporte por token vem de perguntar ao seu navegador. O padrão define os tokens suportados deste atributo como os valores permitidos “e suportados pelo agente de usuário”, o que é o que torna a pergunta respondível — mas ela informa o que o navegador vai analisar, não o que vai honrar, e um motor bem antigo que não exponha lista de tokens suportados simplesmente não responde.
E uma coisa que vale dizer sem rodeios: um sandbox não substitui não servir conteúdo hostil a partir da sua própria origem. O padrão diz isso na mesma seção, e a razão é que quem convencer alguém a abrir a URL emoldurada diretamente a recebe sem sandbox, na sua origem, sem iframe nenhum no meio.
Por que é grátis?
São treze textos e um punhado de regras, e o seu navegador faz tudo enquanto você marca as caixinhas. Nenhum servidor entra na conta, então não há nada a medir nem conta a criar.
Nada é enviado. O atributo que você montar fica nesta aba.