Decodificador de Base64 a Imagen — RFC 4648 + RFC 2397 vía window.atob con bloqueo XSS de SVG
Decodifica cualquier carga útil Base64 en ASCII o data URI completo de vuelta a un archivo de imagen binario descargable según RFC 4648 (Simon Josefsson, IETF octubre de 2006, Standards Track) y RFC 2397 (Larry Masinter, Xerox Corporation, IETF agosto de 1998, Standards Track). El decodificador se ejecuta en tu navegador mediante window.atob() (WHATWG HTML Living Standard, html.spec.whatwg.org/multipage/webappapis.html, definido en Web IDL sobre el mixin WindowOrWorkerGlobalScope), que revierte la expansión Base64 de 4 caracteres ASCII a 3 bytes y recupera los bytes binarios originales. La herramienta detecta el tipo MIME desde un prefijo data URI mediante la expresión regular `^data:(image/\w+);base64,` y lo recorta antes de llamar a atob; si no hay prefijo, la carga útil se decodifica como Base64 crudo y se trata como image/png por defecto. Los bytes decodificados pasan por un buffer Uint8Array (mediante charCodeAt sobre la cadena de salida de atob según la especificación WHATWG ArrayBuffer + TypedArray) a un Blob, y luego se genera una URL de blob con URL.createObjectURL() para el panel de vista previa y el botón de descarga. ENDURECIMIENTO DE SEGURIDAD: la herramienta RECHAZA explícitamente image/svg+xml aunque es un tipo MIME de imagen válido — los documentos SVG pueden contener elementos `<script>` y atributos de manejador de evento en línea (onload, onclick, onerror), y representar un SVG mediante una URL de blob ejecuta esos scripts en el contexto del MISMO ORIGEN de openimages.app, idéntico a abrir un archivo HTML crudo. El aviso divulgado de referencia para este vector es CVE-2022-24833 / GHSA-cqcc-mm6x-vmvw (PrivateBin, XSS de SVG vía URL de blob en vista previa de adjunto, abril de 2022); el patrón XSS-SVG en subidas de usuario es una clase recurrente documentada en avisos y análisis (research.securitum.com Bentkowski 2019; antipatrón `DomSanitizer.bypassSecurityTrustResourceUrl` de Angular en angular.dev/best-practices/security). El bloqueo es defensa en profundidad intencional — convierte fuentes SVG mediante un renderizador del lado del servidor, no una URL de blob del navegador.
Cómo decodificar Base64 a un archivo de imagen descargable
- Copia la cadena Base64 O el data URI completo `data:image/<mime>;base64,...` desde tu fuente (CSS, carga útil de API JSON, plantilla de correo, archivo de configuración, registro de depuración).
- Pega el valor en el área de texto de entrada. Ambas formas funcionan: la expresión regular `^data:(image/\w+);base64,` detecta el MIME automáticamente y recorta el prefijo; el Base64 crudo sin prefijo se decodifica como image/png por defecto.
- La herramienta llama a window.atob() según WHATWG para revertir la expansión Base64 (4 caracteres ASCII → 3 bytes), luego construye un Uint8Array y lo envuelve en un Blob con el MIME detectado.
- Se genera una URL de blob mediante URL.createObjectURL() y se muestra en el panel de vista previa. Si el MIME detectado es image/svg+xml, la decodificación se detiene con un error — el SVG ejecutaría scripts incrustados en el origen de la página (consulta las notas de seguridad).
- Pulsa Descargar para guardar los bytes decodificados como archivo binario real con la extensión correcta (.png, .jpg, .gif, .webp, .avif). La cadena Base64 original se reconstruye byte a byte — Base64 es una codificación textual sin pérdida.
Casos de uso comunes
- Recuperar un PNG/JPG/WebP real desde una cadena `data:image/...;base64,...` copiada de CSS, una respuesta de API JSON, una plantilla de correo o una instantánea de estado guardada.
- Inspeccionar qué contiene realmente un píxel de seguimiento en línea, un favicon codificado o una imagen de firma antes de confiar en ello o de enviarlo.
- Depurar respuestas de API que devuelven imágenes como cadenas Base64 en lugar de multipart binario — pega la carga útil, mira la imagen.
- Extraer adjuntos incrustados de plantillas de correo HTML o demos HTML de un solo archivo donde la imagen está en línea como data URI.
- Verificar que el lado del codificador produjo un ciclo de ida y vuelta válido — codifica una imagen en otro sitio, pega el resultado aquí, confirma que los bytes vuelven a la misma imagen.
Preguntas frecuentes
¿Por qué la herramienta bloquea image/svg+xml?
SVG es XML y puede contener elementos `<script>` y manejadores de evento en línea (onload, onclick, onerror, onmouseover). Cuando el decodificador construye un Blob con tipo image/svg+xml y llama a URL.createObjectURL(), la URL de blob resultante hereda el origen de openimages.app. Cargar dicha URL mediante `<img>` o navegar hacia ella ejecuta el JavaScript incrustado en contexto del mismo origen — exactamente la misma clase de riesgo que abrir un archivo HTML crudo con scripts en línea. El aviso divulgado de referencia es CVE-2022-24833 / GHSA-cqcc-mm6x-vmvw (PrivateBin, XSS de SVG vía URL de blob en vista previa de adjunto, abril de 2022); la clase XSS-SVG en subidas de usuario está documentada en análisis de seguridad (research.securitum.com Bentkowski 2019) y en el antipatrón `DomSanitizer.bypassSecurityTrustResourceUrl` de Angular (angular.dev/best-practices/security). El bloqueo es defensa en profundidad intencional. Para convertir SVG, usa un renderizador del lado del servidor que no comparta su origen con cookies sensibles o almacenamiento, o utiliza una herramienta de imagen de escritorio.
¿Cuál es la diferencia entre Base64 crudo y un data URI?
Un data URI es una cadena Base64 envuelta en el prefijo URI de RFC 2397 `data:image/<mime>;base64,<carga>`. El prefijo declara el MIME explícitamente para que el software receptor (navegadores, bibliotecas de imagen, el decodificador aquí) sepa cómo representar o guardar los bytes. El Base64 crudo es solo la carga útil — los mismos caracteres sin el prefijo — y requiere que el consumidor ya conozca o adivine el MIME. La herramienta ejecuta la expresión regular `^data:(image/\w+);base64,` para detectarlo automáticamente; si coincide, se usa el MIME capturado y se recorta el prefijo; si no coincide, la carga se trata como image/png por defecto.
¿Qué estándar Base64 sigue la herramienta?
RFC 4648 (Simon Josefsson, IETF octubre de 2006, Standards Track) — la especificación canónica actual de Base64, deja obsoleto RFC 3548 de julio de 2003. El decodificador usa window.atob() según el WHATWG HTML Living Standard (html.spec.whatwg.org/multipage/webappapis.html, definido en Web IDL sobre el mixin WindowOrWorkerGlobalScope), que implementa la variante tolerante de RFC 4648 (espacios admitidos, relleno `=` opcional en algunos casos). La primera aparición de Base64 en el IETF fue RFC 989 por John Linn en BBN Communications Corporation (IETF febrero de 1987, PEM Parte I — Procedimientos de Cifrado y Autenticación de Mensajes; obsoletada por RFC 1040 en 1988 y luego por RFC 1113 en 1989), y la especificación canónica previa a RFC 4648 fue RFC 2045 MIME por Freed y Borenstein, IETF noviembre de 1996.
¿La decodificación pierde calidad?
No. Base64 es una representación ASCII sin pérdida de los bytes binarios exactos — cada 4 caracteres ASCII se revierten a exactamente 3 bytes de origen (RFC 4648 §4). El decodificador produce una copia byte a byte idéntica del archivo originalmente codificado. Los únicos modos de fallo son daño al copiar (caracteres que faltan, finales de línea CR/LF mezclados, espacios extra fuera del alfabeto tolerante) y datos binarios no de imagen — atob lanza InvalidCharacterError ante una entrada mal formada.
¿Se suben mis datos a algún sitio?
No. window.atob() es una API nativa síncrona del navegador que se ejecuta enteramente en el contexto JavaScript de la página. La cadena Base64 nunca sale de tu dispositivo — no hay llamada fetch(), no hay XHR, no hay baliza de analítica con la carga útil. El Blob decodificado existe solo en la memoria de tu pestaña; la URL de blob es local a tu navegador y se revoca al cerrar la página.
Decodificación atob() RFC 4648 + análisis del prefijo data URI RFC 2397 + rechazo XSS de SVG
El pipeline analiza prefijos de data URI opcionales según RFC 2397 (Larry Masinter, Xerox Corporation, IETF agosto de 1998, Standards Track — define el esquema URL `data:[<mediatype>][;base64],<data>`), luego llama a window.atob() según el WHATWG HTML Living Standard (html.spec.whatwg.org/multipage/webappapis.html#atob, definido en Web IDL sobre el mixin WindowOrWorkerGlobalScope desde la especificación WebIDL original — atob es un inverso síncrono de Base64 sobre un alfabeto Base64 tolerante [A-Za-z0-9+/=] con espacios admitidos, lanza InvalidCharacterError ante una entrada mal formada según la especificación). La salida de atob es una cadena JavaScript donde la unidad de código UTF-16 (0-255) de cada carácter representa un byte decodificado; la herramienta itera con charCodeAt para poblar un Uint8Array (especificación TypedArray de WHATWG), lo envuelve en un Blob con el MIME detectado (W3C File API), y genera una URL de blob mediante URL.createObjectURL() (W3C File API) para la vista previa y la descarga. El algoritmo Base64 propiamente dicho sigue RFC 4648 (Simon Josefsson, IETF octubre de 2006, Standards Track, deja obsoleto RFC 3548 de julio de 2003; la primera aparición de Base64 en el IETF fue RFC 989 por John Linn en BBN Communications Corporation, IETF febrero de 1987, PEM Parte I — Procedimientos de Cifrado y Autenticación de Mensajes, obsoletada por RFC 1040 en 1988 y luego por RFC 1113 en 1989; la especificación canónica previa a RFC 4648 fue RFC 2045 MIME por Freed y Borenstein, IETF noviembre de 1996) — el alfabeto de 64 caracteres A-Z + a-z + 0-9 + + + / con relleno `=` produce exactamente 4/3 caracteres ASCII por cada 3 bytes de origen. Detección de MIME: la herramienta ejecuta `^data:(image/\w+);base64,` sobre la entrada — si coincide, se usa el MIME capturado y se recorta el prefijo; si no coincide, la carga útil se trata como Base64 crudo con image/png como tipo por defecto. SEGURIDAD: image/svg+xml es RECHAZADO con un mensaje de error. La razón: SVG es XML, puede contener `<script>` y manejadores de evento en JavaScript (onload, onclick, onmouseover), y una URL de blob producida por URL.createObjectURL() hereda el origen de la página (openimages.app) — abrir o cargar mediante `<img src>` dicha URL de blob con tipo image/svg+xml ejecuta el script incrustado en contexto del mismo origen según la especificación SVG del W3C y la semántica de fetch + URL de blob de WHATWG. El aviso divulgado de referencia para este vector exacto es CVE-2022-24833 / GHSA-cqcc-mm6x-vmvw (PrivateBin, XSS de SVG vía URL de blob en vista previa de adjunto, abril de 2022); la clase XSS-SVG en subidas de usuario aparece en análisis de seguridad (research.securitum.com Bentkowski 2019) y en el antipatrón `DomSanitizer.bypassSecurityTrustResourceUrl` de Angular (angular.dev/best-practices/security). El rechazo es defensa en profundidad deliberada; la comprobación se ejecuta tras extraer el prefijo, por lo que un actor malicioso que prepare una carga útil SVG no puede eludir la expresión regular re-prefijando el MIME. Convierte SVG mediante un pipeline de renderizado del lado del servidor que no comparta el origen con cookies sensibles o almacenamiento.
- Decodificación Base64 según RFC 4648 (Josefsson, IETF octubre de 2006, Standards Track) — deja obsoleto RFC 3548 julio de 2003; historia de Base64 RFC 989 (Linn, BBNCC, febrero de 1987) + RFC 2045 noviembre de 1996
- Análisis de data URI según RFC 2397 (Masinter, Xerox Corporation, IETF agosto de 1998, Standards Track) — esquema URL `data:[<mediatype>][;base64],<data>`
- API nativa del navegador window.atob() de WHATWG — html.spec.whatwg.org/multipage/webappapis.html sobre el mixin WindowOrWorkerGlobalScope, alfabeto Base64 tolerante, InvalidCharacterError ante entrada mal formada
- Detección automática de MIME mediante la expresión regular `^data:(image/\w+);base64,` — recorta el prefijo, captura el MIME; recurre a image/png cuando no hay prefijo
- Pipeline: cadena de atob() → bucle charCodeAt → Uint8Array → Blob → URL de blob de URL.createObjectURL() para vista previa y descarga (TypedArray de WHATWG + File API del W3C)
- SEGURIDAD: image/svg+xml es RECHAZADO — SVG puede llevar `<script>` y manejadores de evento en línea (onload/onclick); las URL de blob heredan el origen openimages.app, ejecutando los scripts en contexto del mismo origen
- Aviso divulgado de referencia: CVE-2022-24833 / GHSA-cqcc-mm6x-vmvw (PrivateBin, XSS de SVG vía URL de blob en vista previa de adjunto, abril de 2022); el patrón se repite en análisis XSS-SVG de subidas de usuario (research.securitum.com Bentkowski 2019; antipatrón DomSanitizer.bypassSecurityTrustResourceUrl de Angular)
- Nativo del navegador — sin SDK, sin subida, sin ida y vuelta al servidor; la carga útil permanece en tu pestaña
Gratis. Sin registro. Sin subidas. Anuncios mediante AdSense (con consentimiento).
Fuentes (10)
- Josefsson, S. (SJD) (2006). The Base16, Base32, and Base64 Data Encodings. RFC 4648, IETF (October 2006, Standards Track) — obsoletes RFC 3548 (July 2003); §4 standard Base64 with forgiving decode (whitespace tolerated).
- Masinter, L. (Xerox Corporation) (1998). The 'data' URL scheme. RFC 2397, IETF (August 1998, Standards Track) — `data:[<mediatype>][;base64],<data>` URL syntax parsed by the tool's `^data:(image/\w+);base64,` regex.
- Freed, N. (Innosoft) & Borenstein, N. (First Virtual Holdings) (1996). Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies. RFC 2045, IETF (November 1996, Standards Track) — pre-RFC 4648 canonical Base64 spec; §6.8 defines the 64-character alphabet and `=` padding.
- Linn, J. (BBN Communications Corporation) (1987). Privacy Enhancement for Internet Electronic Mail: Part I — Message Encipherment and Authentication Procedures. RFC 989, IETF (February 1987) — first IETF appearance of Base64 encoding; obsoleted by RFC 1040 (1988) then RFC 1113 (1989); superseded by RFC 4648.
- WHATWG (live). HTML Living Standard — window.atob(). html.spec.whatwg.org/multipage/webappapis.html#atob — synchronous Base64 decode on WindowOrWorkerGlobalScope mixin; forgiving alphabet tolerates whitespace; throws InvalidCharacterError on malformed input.
- WHATWG (live). HTML Living Standard — URL.createObjectURL() blob URL semantics. url.spec.whatwg.org + html.spec.whatwg.org — blob URLs inherit the page's origin; loading a blob URL with image/svg+xml MIME executes embedded scripts in same-origin context.
- W3C SVG Working Group (2018). Scalable Vector Graphics (SVG) 2. W3C Candidate Recommendation 4 October 2018 — SVG documents support `<script>` elements and inline event-handler attributes (onload, onclick, onerror, onmouseover); scripts execute in document's origin.
- Bentkowski, M. (Securitum) (2019). Do you allow to load SVG files? You have XSS!. research.securitum.com — primary-source write-up of SVG-via-user-upload XSS class; documents the `<script>` + `onload`/`onclick`/foreignObject vectors that justify the SVG MIME block.
- PrivateBin maintainers (2022). GHSA-cqcc-mm6x-vmvw / CVE-2022-24833 — SVG attachment preview blob URL XSS. github.com/PrivateBin/PrivateBin/security/advisories/GHSA-cqcc-mm6x-vmvw + privatebin.info/reports/vulnerability-2022-04-09.html — the canonical disclosed advisory for the SVG-via-`URL.createObjectURL` same-origin XSS vector this tool defends against.
- Angular maintainers (live). Angular Security Guide — DomSanitizer.bypassSecurityTrustResourceUrl misuse. angular.dev/best-practices/security — documents the SVG-resource-URL antipattern where bypassing the sanitiser on untrusted SVG sources permits same-origin script execution.
Son las especificaciones del W3C, ISO/IEC, ITU-T e IETF que la herramienta implementa o sobre las que se apoya. Localízalas en w3.org, iso.org, itu.int o datatracker.ietf.org.
Por Marco B. ·