← Todos los checks
SeguridadSeveridad típica: Medio

Secretos en comentarios HTML

Busca claves, contraseñas o tokens olvidados dentro de los comentarios del HTML que cualquiera puede leer.

Qué comprueba

Este escáner busca dentro de los comentarios del HTML claves, contraseñas o tokens que se hayan quedado olvidados ahí. Detecta secretos escritos en comentarios que cualquiera puede ver al mirar el código fuente de la página.

Por qué importa

Los comentarios del HTML no son privados: llegan tal cual al navegador y cualquiera puede leerlos con un par de clics. Un secreto olvidado ahí equivale a publicarlo, y puede dar acceso directo a servicios o datos sensibles.

Cómo se arregla

Elimina cualquier comentario con credenciales del código publicado y, si un secreto llegó a exponerse, revócalo y genera uno nuevo cuanto antes. Guarda siempre las claves en variables de entorno del servidor, nunca en el HTML que ve el navegador.

Cómo funciona esta comprobación

Scanaris extrae todos los comentarios HTML de tu página principal, es decir, todo lo que va entre <!-- y -->, y busca dentro seis patrones de secreto. Cuatro son formatos de clave reconocibles: claves secretas de Stripe (sk_live_ seguido de 20 o más caracteres), claves de acceso de AWS (AKIA y 16 caracteres), claves de API de Google (AIza y 35 caracteres) y cabeceras de clave privada (-----BEGIN PRIVATE KEY----- y variantes RSA o EC). Los otros dos son asignaciones explícitas: password, passwd o pwd seguidos de un valor de al menos 6 caracteres, y api_key, secret, token o bearer seguidos de un valor de al menos 16. Si alguno coincide, abre un hallazgo de severidad alta que indica el tipo de secreto encontrado, nunca el valor. Los patrones son estrictos a propósito: un comentario que diga "aquí va el token" sin un valor detrás no se marca.

Por qué importa

Los comentarios HTML no se ven en la página, pero sí en el código fuente, y el código fuente lo ve cualquiera con Ctrl+U o con un curl. No hay diferencia práctica entre poner una clave en un comentario y publicarla en un foro. Una clave secreta de Stripe permite crear cargos y reembolsos; una de AWS, usar tu cuenta y tu factura; una contraseña de base de datos, leerlo todo. Y los buscadores de secretos automatizados recorren la web entera buscando exactamente estos prefijos, así que el tiempo entre publicar la clave y que alguien la use se mide en minutos.

Por qué pasa

Alguien deja una nota para sí mismo durante el desarrollo ("<!-- usuario admin / password Temporal2024 -->"), comenta un bloque de configuración "para probar" en lugar de borrarlo, o pega un ejemplo de integración con la clave real. Las plantillas de WordPress y los sitios estáticos hechos a mano son los más propensos, porque sus comentarios llegan al navegador tal cual. En frameworks modernos pasa menos, pero pasa: un comentario en un .html estático de la carpeta pública o en un componente que no se compila.

Cómo arreglarlo

  • Rota la credencial primero. Da por hecho que ya la han leído. Genera una nueva en el proveedor, cámbiala en tu servidor y revoca la antigua. Después borra el comentario; no al revés.
  • Busca en el proyecto antes de desplegar, no solo en la página principal:
grep -rnE "sk_live_|AKIA[0-9A-Z]{16}|AIza[0-9A-Za-z_-]{35}|BEGIN (RSA |EC )?PRIVATE KEY|(password|api_key|secret|token)\s*[:=]" --include=*.html --include=*.vue --include=*.php --include=*.hbs .
  • Elimina los comentarios en producción. Vue y Nuxt los quitan al compilar; en Next.js los comentarios JSX nunca llegan al HTML. Para HTML estático o WordPress, un minificador (html-minifier-terser con removeComments) o el plugin de optimización que uses los elimina. En PHP, usa comentarios de PHP (<?php // ... ?>), que no salen del servidor.
  • Las credenciales van en variables de entorno, nunca en ficheros que se sirven. Y añade un detector de secretos al repositorio (gitleaks o el escaneo de secretos de GitHub) para que no vuelva a entrar.

Comprueba que está arreglado

curl -s https://tudominio.com | tr -d '\n' | grep -oE '<!--.{0,200}' | grep -iE "sk_live_|AKIA|AIza|PRIVATE KEY|password|api_key|secret|token|bearer"

No debería salir nada. Lo ideal es que la primera parte, sin el último filtro, tampoco devuelva comentarios: en producción no hacen falta.

Preguntas frecuentes

Es una clave de prueba, no de producción.

Los patrones distinguen: sk_test_ de Stripe no se marca, sk_live_ sí. Si el hallazgo apareció, es porque el formato coincide con una clave real o con una asignación explícita de contraseña. Si de verdad es un valor ficticio, cámbialo por algo que no parezca una credencial, como REEMPLAZAR.

¿Se revisan también los comentarios del JavaScript?

Esta comprobación solo mira el HTML. Las claves dentro de los bundles de JavaScript, con o sin comentario, las busca secretos en JavaScript, y las referencias a hosts internos, referencias internas. Qué más se filtra sin querer está en secretos que tu app filtra en el navegador.

¿Los comentarios condicionales de Internet Explorer cuentan?

Son comentarios HTML y se analizan igual, pero no contienen secretos y no se marcan. Aun así, en 2026 sobran: ningún navegador soportado los interpreta.

Compruébalo en tu web

Escanea tu web gratis y mira si este y otros 44 checks pasan, con un prompt de arreglo por cada fallo.

Escanear mi web gratis

Del blog

Checks relacionados