Como decodificar Base64 para HTML
- Cole o Base64 em Base64 ou data URI. Um URI
data:text/html;base64,também funciona. Para um corpo de e-mail grande salvo como texto, use Abrir arquivo .txt. - A lista de informações mostra o charset e a quantidade de linhas. Abaixo dela, um frame em sandbox mostra a página renderizada, com o aviso “Prévia em sandbox: scripts, formulários e recursos externos são bloqueados. O código-fonte está abaixo.”
- O painel Texto, abaixo da prévia, guarda o código-fonte. Copiar texto copia tudo.
- Clique em Baixar arquivo para salvar
decoded.html.
Nada é enviado a lugar nenhum. A decodificação acontece no seu navegador, e a página não pode fazer requisições de rede, exceto as do contador de visitas da Cloudflare.
Por que a prévia fica em sandbox
HTML de origem desconhecida pode fazer muito mais do que exibir texto. Um corpo de e-mail pode trazer um pixel de rastreamento que informa quando e onde ele foi aberto, uma página de phishing pode conter um formulário de login que envia os dados ao atacante, e qualquer página pode rodar scripts. A prévia bloqueia cada uma dessas coisas:
| Ameaça | O que impede |
|---|---|
Scripts, incluindo onclick inline e <script> | O iframe tem o atributo sandbox sem nenhuma permissão, então scripts nunca rodam |
| Formulários que enviam senhas | O sandbox não permite envio de formulários |
| Pop-ups e redirecionamentos da página principal | Não permitidos pelo sandbox |
| Leitura desta página ou do armazenamento dela | O conteúdo em sandbox recebe uma origem única, sem acesso a nada |
| Pixels de rastreamento, imagens, fontes e CSS remotos | A Content Security Policy da página bloqueia toda requisição a outro servidor |
A política também bloqueia estilos inline, então a prévia mostra o texto, os links e a estrutura da mensagem de forma mais crua do que um cliente de e-mail. Imagens embutidas como URIs data: são permitidas e aparecem normalmente.
Páginas com mais de 2 MB não ganham prévia (“Grande demais para pré-visualizar aqui. Veja o código-fonte abaixo ou baixe o arquivo.”). O painel de código-fonte mostra os primeiros 256 KB de qualquer documento; Copiar texto copia o código completo de documentos de até 8 MB.
Como reconhecer HTML em Base64
| O Base64 começa com | Início decodificado |
|---|---|
PCFET0NUWVBFIGh0bWw | <!DOCTYPE html |
PCFkb2N0eXBlIGh0bWw | <!doctype html |
PGh0bWw | <html |
77u/PCFET0NUWVBF | Um byte order mark UTF-8, depois <!DOCTYPE |
CjwhRE9DVFlQRS | Uma quebra de linha, depois <!DOCTYPE |
PGRpdg, PHA+ | <div, <p>: um fragmento HTML, detectado como HTML |
O charset é detectado pelos bytes: byte order mark, UTF-16, UTF-8 válido ou, como último recurso, Windows-1252. Uma tag <meta charset> dentro do documento não é consultada, então uma página em outra codificação legada pode mostrar acentos errados na prévia, enquanto o arquivo baixado mantém os bytes originais.
De onde vem o HTML em Base64
No e-mail, a versão HTML de uma mensagem muitas vezes é uma parte MIME com Content-Type: text/html e Content-Transfer-Encoding: base64. Cole aqui só as linhas codificadas dessa parte, ou abra a mensagem bruta inteira no decodificador de EML, que mostra todas as partes e anexos. Base64 no e-mail explica a estrutura.
Alguns serviços que recebem ou renderizam e-mails entregam o corpo HTML como campo Base64 no JSON de um webhook ou de uma API, e APIs de templates e de geração de PDF às vezes devolvem o HTML gerado do mesmo jeito. Decodificar Base64 dentro de JSON trata um payload inteiro de uma vez.
Campanhas de phishing usam URIs data:text/html para levar uma página de login falsa completa dentro de um link ou anexo. Colar o URI aqui mostra a página sem executá-la. Para montar esses URIs, veja HTML para Base64.
Prévia de HTML não confiável no seu próprio app
A mesma abordagem funciona em qualquer página web: decodifique e coloque o resultado em um iframe com o atributo sandbox vazio. O sandbox sozinho não impede que imagens e folhas de estilo remotas carreguem, então acrescente uma Content Security Policy no início do frame:
function previewHtml(b64, container) {
const bytes = Uint8Array.from(atob(b64), (c) => c.charCodeAt(0));
const html = new TextDecoder().decode(bytes);
const csp = `<meta http-equiv="Content-Security-Policy" content="default-src 'none'; img-src data:; style-src 'unsafe-inline'">`;
const frame = document.createElement("iframe");
frame.setAttribute("sandbox", "");
frame.srcdoc = csp + html;
container.append(frame);
}
No Chrome, uma página de teste com um script, uma folha de estilo remota e uma imagem remota não rodou nenhum script nem fez nenhuma requisição com essa função; sem a linha <meta>, a imagem e a folha de estilo foram baixadas. Diferente da prévia desta página, ela mantém os estilos inline. Mais em Base64 em JavaScript.
Perguntas frequentes
Como decodificar Base64 para HTML?
Cole a string na caixa acima. O código HTML aparece em Texto, com uma prévia em sandbox acima dele, e Baixar arquivo salva tudo como arquivo .html.
É seguro ver aqui o HTML de um e-mail de phishing?
A prévia roda com todas as permissões do sandbox desligadas, então scripts não rodam e formulários não podem ser enviados, e a Content Security Policy da página a impede de carregar qualquer coisa da internet, pixels de rastreamento incluídos. Abrir o arquivo baixado numa aba normal do navegador não tem nenhuma dessas proteções.
Por que a prévia aparece sem estilo?
Os estilos são bloqueados junto com todo o resto: a política de segurança que barra o conteúdo remoto também impede blocos <style> inline e atributos style. A prévia mostra o texto, os links e as imagens data: embutidas, o que basta para avaliar o que a mensagem diz.
Meu Base64 decodifica para HTML, mas a ferramenta diz XML ou Text. Por quê?
A ferramenta reconhece HTML por <!doctype html, <html ou por uma tag HTML comum como <div>, <p> ou <table> no início. Um fragmento que começa com um elemento personalizado ou com texto simples aparece como XML ou Text. Digite text/html em Tipo MIME para ter a prévia HTML e html em Extensão antes de baixar.