Analizador de security.txt (RFC 9116)
WebTodo se ejecuta en tu navegador: no se sube nada
Un `security.txt` es un archivo de texto plano en la raíz de un sitio cuya función es decirle a quien investiga seguridad con quién contactar ante una vulnerabilidad. Sin él, esa persona solo puede adivinar — si es `security@` o `abuse@`, si hay programa de recompensas, si se aceptan informes cifrados. Adivinar mal significa que el informe se publica igualmente o que no se envía nunca. La sintaxis es tan simple que «un `campo: valor` por línea» tienta a cualquiera a escribirse unas líneas de análisis. Pero lo que de verdad importa en la RFC 9116 son dos requisitos obligatorios que un analizador casero casi nunca comprueba: · `Expires` es obligatorio, y debe ser un instante RFC 3339 con zona horaria. Sin él el archivo no cumple la norma; y un archivo caducado debe tratarse como si no existiera — que es la parte peligrosa, porque significa que los datos de contacto que crees estar publicando caducaron hace tiempo mientras el archivo sigue viéndose perfecto. · `Contact` es obligatorio, y cada entrada debería ser una URL con protocolo (`mailto:` o `https:`). Un `security@example.com` pelado se ve del todo normal, pero muchos analizadores descartan esa entrada. Así que lo que sale de aquí no es una lista de campos, sino un veredicto sobre si el archivo sirve de algo. ⚠️ Está sin conexión: no irá a buscar `https://example.com/.well-known/security.txt` por ti, ni puede comprobar que una dirección exista. Consigue el archivo tú — abre esa URL en el navegador, o hazle `curl` — y pega el contenido aquí.
Funciones
- ⚠️ La primera fila es el veredicto: válido, caducado, sin Expires o un Expires ilegible — cada uno con su color
- Cuando falta Expires o está mal formado, explica por qué eso deja el archivo inservible, en vez de limitarse a marcar un error de sintaxis
- Expires debe llevar zona horaria (`Z` o `±HH:MM`) — un instante sin ella no tiene significado definido, y distintas zonas no se pondrían de acuerdo sobre cuándo caduca el archivo
- Los valores que no son URL en Contact / Policy / Canonical y compañía se señalan uno a uno, con el número de línea
- Los nombres de campo no distinguen mayúsculas, los comentarios `#` se listan aparte, y un campo repetido conserva todos sus valores (se supone que Contact se puede repetir)
- Los campos no reconocidos se listan — la RFC exige ignorarlos, así que un nombre mal escrito se descarta en silencio en vez de reportarse
- Entiende los archivos con firma PGP en claro: el cuerpo se extrae del bloque de firma y se deshace el escape con `- `
- Un informe alineado en dos columnas que puedes copiar entero
- Todo se ejecuta en tu navegador; lo que pegas no se sube nunca
Cómo se usa
- Consigue el archivo: abre `https://<dominio>/.well-known/security.txt` (los sitios antiguos quizá solo tengan `security.txt` en la raíz)
- Copia todo y pégalo aquí
- Lee primero el veredicto y luego la lista de campos
- Lo que esté mal apunta a un número de línea concreto, así que puedes volver y arreglar esa línea
Preguntas frecuentes
- ¿Puede buscar el security.txt de otra persona?
- No. Este es un sitio estático sin backend, y cada herramienta se ejecuta solo en tu navegador — ese es el precio de la regla de «los datos no salen del navegador». Para conseguir el archivo, abre `https://dominio/.well-known/security.txt` en el navegador (es texto plano y se mostrará directamente), o haz `curl https://dominio/.well-known/security.txt`. Algunos sitios lo publican en las dos ubicaciones; la especificación prefiere la de `/.well-known/`.
- ¿Qué pasa cuando ha pasado Expires?
- La RFC 9116 dice que un archivo caducado debe tratarse como si no existiera. Ese requisito es justo la razón de que exista Expires: los contactos cambian, los dominios pasan de mano, los equipos se disuelven. Un archivo escrito en 2019 que siguiera válido para siempre podría mandar a quien investiga a un buzón que ya no tiene nada que ver con el sitio, lo cual es peor que no tener archivo. Por eso muchos escáneres se saltan directamente los archivos caducados, lo que significa que los datos de contacto que crees publicar pueden estar ya muertos. Pon la caducidad a uno o dos años y actualízala antes de que venza.
- ¿Contact debe llevar un correo o una URL?
- Los dos necesitan protocolo: `mailto:security@example.com` o `https://example.com/report`. Un `security@example.com` pelado es legible para una persona, pero no es una URI, y los analizadores trabajan con URIs — muchas implementaciones descartan esa entrada. Puedes poner varias entradas Contact (la norma lo permite), por convención de la más preferida a la menos: por ejemplo, una URL de formulario y después un correo. Si se aceptan informes cifrados, apunta `Encryption:` a la URL de la clave (no pegues la clave; ese campo también debe ser una URI).
- ¿Por qué un nombre de campo mal escrito no da error?
- Porque la norma lo dice: los campos no reconocidos deben ignorarse. Esa regla existe por compatibilidad hacia adelante — cuando la RFC gane un campo nuevo, los analizadores antiguos no deberían rechazar todo el archivo por no conocerlo. El precio es que una errata (un `Acknowledgment` sin la ese final, un `Preferred-Language` igual) no produce ningún aviso; la entrada simplemente se descarta. Por eso aquí se listan los nombres de campo no reconocidos: no se tratan como errores, pero se hacen visibles.
- ¿Qué es eso de la firma PGP?
- La norma recomienda (no exige) firmar todo el archivo con firma PGP en texto claro, que envuelve el cuerpo en `-----BEGIN PGP SIGNED MESSAGE-----` y añade un bloque de firma. La ventaja es que otros pueden confirmar que el archivo salió de ti de verdad y no se alteró por el camino. Esta herramienta extrae el cuerpo del bloque de firma y deshace el escape con `- ` que exige el formato de texto claro, pero no verifica la firma — eso necesita una clave pública, y la clave necesita la red. Para eso usa `gpg --verify`.
Herramientas relacionadas
Validador de config
WebComprueba package.json, .env, robots.txt, sitemap.xml o cabeceras HTTP. Hallazgos en tres niveles —errores, avisos y sugerencias—, cada uno explicado.
Magic bytes
WebIdentifica un archivo por sus primeros bytes. Cubre 59 formatos, admite firmas con desplazamiento y busca los magic bytes de un formato dado.
Códigos de estado HTTP
WebConsulta un código de estado HTTP: significado, clase 1xx–5xx, usos típicos y trampas habituales. También busca por palabra clave. Todo local.
Analizador de URL
WebDescompone una URL en esquema, host, puerto, ruta, parámetros y ancla, con cada parámetro en crudo y decodificado. Todo en tu navegador.
Analizador de UA
WebAnaliza un User-Agent: navegador, versión, sistema, tipo de dispositivo y motor, con las reglas que coinciden. Solo coincidencia de patrones.
Tipos MIME
WebConsulta el tipo MIME a partir de una extensión, o la extensión por defecto de un tipo de medio. Solo los habituales. Todo en tu navegador.