Objetivos de aprendizaje
Después de leer este artículo podrás:
- Invalidar el token filtrado antes de que alguien lo use
- Descubrir qué pudo haber hecho un atacante con el bot
- Cambiar el token en el hosting y evitar una nueva filtración
En esta página
- ¿Qué hacer en los primeros minutos?
- ¿Cómo restablecer el token del bot?
- ¿Qué puede hacer un atacante con el token?
- ¿Cómo saber si alguien usó el token?
- ¿Cómo cambiar el token sin dejar el bot caído mucho tiempo?
- ¿Cómo limpiar el repositorio después?
- ¿Cómo evitar que el token se filtre de nuevo?
- Cómo hacerlo en Square Cloud
- Preguntas frecuentes
El token del bot es su contraseña. Quien lo tiene entra en Discord o en Telegram como tu bot, sin necesitar nada más: ni usuario, ni código de verificación. Si apareció en un repositorio público, en una captura de pantalla, en un log o en una conversación, trátalo como comprometido desde ese momento.
La corrección principal toma un minuto. Lo que demora es descubrir qué se hizo con el token y asegurarte de que el nuevo no se filtre de la misma forma.
¿Qué hacer en los primeros minutos?#
Sigue este orden. No empieces por limpiar el repositorio.
- Restablece el token. Es el único paso que deja inútil el valor filtrado.
- Actualiza el token nuevo donde corre el bot y reinicia el proceso.
- Audita el servidor o el chat en busca de acciones que tú no hiciste.
- Limpia el código y el historial de Git.
- Corrige la causa para que el próximo token no se filtre.
Cuanto antes hagas el paso 1, menor será la ventana de ataque. Hay robots que escanean los repositorios públicos buscando tokens, así que no esperes.
¿Cómo restablecer el token del bot?#
Discord#
En el Portal de Desarrolladores, abre tu aplicación, entra en la pestaña Bot y haz clic en Reset Token y confirma. Eso invalida todos los tokens antiguos del bot, según la guía de discord.js. Copia el nuevo valor en el momento y guárdalo directamente en la variable de entorno.
Después del restablecimiento el bot queda fuera de línea hasta que actualices el token en el lugar donde corre. Eso es lo esperado.
Telegram#
Abre una conversación con @BotFather y envía /token. La documentación de Telegram indica ese comando cuando el token está comprometido o se perdió. Elige el bot y BotFather te devuelve un token nuevo. Otra opción está en /mybots: elige el bot, luego API Token y Revoke current token. En cualquier caso, confirma después que el token antiguo fue rechazado (mira más abajo).
¿Discord o GitHub invalidan el token por mí?#
No dependas de eso. GitHub tiene un patrón de secret scanning para el token de bot de Discord (discord_bot_token), marcado como patrón de socio y con soporte de push protection. El token de bot de Telegram (telegram_bot_token) aparece en la lista sin socio y sin push protection. Detalles en la lista de patrones de GitHub.
Incluso para Discord, la documentación no garantiza que el token se restablezca automáticamente, y la detección solo vale para repositorios de GitHub. Un token pegado en una captura, en un canal de soporte o en un log no pasa por ese filtro.
¿Qué puede hacer un atacante con el token?#
Todo lo que el bot puede hacer, limitado por los permisos que tiene en los servidores. La guía de discord.js enumera el riesgo típico: spam en todos los servidores del bot, MD masivos, borrar canales, expulsar o banear miembros y hacer que el bot salga de los servidores.
Por eso el daño depende de los permisos. Un bot con Administrador puede todo; un bot que solo lee y responde mensajes hace mucho menos. Es un buen motivo para darle al bot solo lo necesario.
Restablecer el token no deshace lo que ya se hizo. Tampoco elimina lo que el atacante creó y que no depende del token, como los webhooks: la URL de un webhook lleva su propio token, así que sigue funcionando hasta que se borra, según la documentación de webhooks.
¿Cómo saber si alguien usó el token?#
En Discord#
Abre los ajustes del servidor y mira el Registro de auditoría. Las entradas se guardan durante 45 días, y la documentación de Discord dice que hace falta el permiso VIEW_AUDIT_LOG para verlas. Busca:
- canales, roles o invitaciones creados o borrados que no reconoces;
- webhooks nuevos (borra los sospechosos);
- miembros baneados o expulsados sin motivo;
- cambios de permisos en los roles.
Revisa también la lista de servidores donde está el bot. Si hay un servidor desconocido, saca el bot de ahí.
Confirmar que el token antiguo dejó de funcionar#
Prueba si el token filtrado todavía se acepta. La API de Discord recibe el token en el encabezado Authorization: Bot, como describe la referencia de la API:
OLD_TOKEN="pegalo-aqui"
curl -s -o /dev/null -w "%{http_code}\n" \
-H "Authorization: Bot $OLD_TOKEN" \
https://discord.com/api/v10/users/@me200 significa que el token sigue siendo válido y el restablecimiento no se aplicó. 401 (no autorizado) es el resultado esperado de un token invalidado. En Telegram, la prueba equivalente es el método getMe de la Bot API, que debe responder 401 para el token antiguo:
curl -s -o /dev/null -w "%{http_code}\n" "https://api.telegram.org/bot$OLD_TOKEN/getMe"Después de la prueba, limpia el historial de la terminal.
¿Cómo cambiar el token sin dejar el bot caído mucho tiempo?#
La clave es tener un solo lugar donde vive el token. Si está repartido en varios archivos, vas a olvidarte de alguno.
- Lee el token de una variable de entorno, nunca de un string en el código:
// index.js (discord.js v14)
import { Client, Events, GatewayIntentBits } from "discord.js";
const token = process.env.DISCORD_TOKEN;
if (!token) throw new Error("DISCORD_TOKEN no está definida");
const client = new Client({ intents: [GatewayIntentBits.Guilds] });
client.once(Events.ClientReady, () => console.log(`En línea como ${client.user.tag}`));
client.login(token);- Actualiza el valor de la variable en el hosting y en el
.envlocal. - Reinicia el bot y revisa el log.
Si el bot no vuelve, mira por qué el bot de Discord queda fuera de línea: un token antiguo olvidado en otro entorno (pruebas, CI, otra máquina) es una causa común.
¿Cómo limpiar el repositorio después?#
Solo después de restablecerlo. La documentación de GitHub dice que, si el dato es una credencial, revocarla o cambiarla puede bastar, y reescribir el historial no siempre es necesario.
Primero descubre dónde está el token en el historial:
git log --all -S"parte-del-token" --onelineSi se subió un .env entero, GitHub documenta git-filter-repo (versión 2.47 o más reciente) con --sensitive-data-removal:
git-filter-repo --sensitive-data-removal --invert-paths --path .env
git push --force --mirror originEso cambia los hashes de los commits, elimina las firmas y no borra los forks ni los clones de otras personas. El paso a paso completo, con las precauciones, está en clave de API expuesta en GitHub. Como el token ya se restableció, esta limpieza es higiene, no seguridad.
¿Cómo evitar que el token se filtre de nuevo?#
- Fuera del código. Variable de entorno, o
.enven el.gitignoredesde el primer commit. Mira qué son las variables de entorno y qué es un archivo .env. - Un token por entorno. Una aplicación en el Portal para desarrollar y otra para producción, como explica el token del bot de Discord.
- Permisos mínimos. Evita Administrador. Pide solo lo que el bot usa.
- Nada de tokens en capturas, logs o ZIP. Quien te ayuda en un servidor de soporte nunca necesita el token.
- Push protection activada en GitHub y una pasada por la checklist de seguridad del deploy.
Cómo hacerlo en Square Cloud#
En Square Cloud, los pasos 2 y 3 del cambio (actualizar el valor y reiniciar) ocurren en el mismo lugar, sin tocar el código. El token vive en una variable de entorno de la aplicación, como el DISCORD_TOKEN del ejemplo, que editas en el panel, con la API, con la extensión de VS Code o con la CLI, usando app env set y después app restart. El cambio se aplica en el siguiente reinicio, sin rebuild, y ninguna otra aplicación de la misma cuenta puede leer ese valor.
Para confirmar que volvió, abre los logs en tiempo real en el panel, la CLI, VS Code o la app del celular y busca la línea En línea como ... del ejemplo. Si seguiste el consejo de un token por entorno, cada aplicación (pruebas y producción) tiene sus propias variables, así que cambiar el token de una no tumba la otra. El panel también importa un .env y exporta el conjunto como KEY=VALUE; deja el archivo fuera del ZIP y del repositorio, para que el token solo exista ahí.
El restablecimiento en sí sigue haciéndose en el Portal de Discord o en BotFather, y la auditoría del servidor también es tuya. Mira cómo funcionan las variables de entorno y qué ofrece la plataforma para bots.
Infraestructura
Mitigación de DDoS L3/L4/L7 y WAF en todos los planes
Preguntas frecuentes
¿Borrar el commit con el token lo resuelve?
No. Git guarda el historial, y el token puede haberse copiado en forks, clones y robots de escaneo. Solo restablecer el token cierra la puerta.
¿Discord invalida el token por su cuenta cuando aparece en GitHub?
No cuentes con eso. GitHub tiene un patrón para tokens de bot de Discord y avisa al socio, pero la documentación no promete el restablecimiento. Restablécelo tú.
¿Y si se filtró el token de Telegram?
Habla con @BotFather y usa el comando /token para generar uno nuevo. La documentación de Telegram indica ese comando para un token comprometido o perdido.
¿Tengo que crear un bot nuevo?
Normalmente no. Restablecer el token mantiene el mismo bot, en los mismos servidores. Solo actualiza el valor donde corre el bot y reinícialo.
Más en Seguridad
Ver los 10 artículos- ¿Qué es un ataque de fuerza bruta y cómo protegerte?Un ataque de fuerza bruta prueba contraseñas en masa hasta acertar una. Mira los tipos (spraying, credential stuffing), cómo funcionan y las defensas con código.
- Hackearon mi aplicación: qué hacer ahoraSi hackearon tu aplicación, contén el acceso, cambia todos los secretos y conserva los logs antes de limpiar. El orden correcto, cómo hallar la causa y cómo volver.
- Checklist de seguridad para publicar un bot, sitio o APIChecklist de seguridad antes de publicar un bot, sitio o API: secretos en variables de entorno, dependencias, HTTPS, cabeceras, permisos mínimos y logs.
- Cómo proteger tu web contra DDoSPara protegerte de un DDoS, combina mitigación en el borde (CDN y WAF) con límite de peticiones, timeouts y caché en la aplicación. Guía paso a paso con código.