Mejores prácticas de seguridad para bots de Telegram
El token de un bot es una contraseña que cualquiera puede usar desde cualquier lugar, sin segundo factor y sin alerta de inicio de sesión. La mayoría de los incidentes con bots de Telegram empiezan ahí. Esto es lo que debes blindar, en el orden en que suele salir mal.
1. Trata el token como una credencial viva
Quien tenga el token de tu bot lo controla por completo. Puede leer los mensajes entrantes, enviar mensajes en tu nombre y cambiar tu webhook para que tu propio servidor deje de recibir actualizaciones. No hay solicitud de contraseña ni aprobación de dispositivo de por medio.
Dónde se filtran los tokens
- Se suben a un repositorio. Con diferencia, la vía más habitual, y los repositorios públicos son escaneados constantemente por bots que no son tuyos.
- Se pegan en un chat de soporte o en un rastreador de incidencias. Una vez que está en un ticket, queda en algún índice de búsqueda.
- Se codifican directamente en una app móvil o en el frontend. Cualquier cosa que llegue a un dispositivo cliente es pública.
- Quedan en los logs. Si registras la URL completa de la API, el token está en la URL.
Qué hacer en su lugar
- Guarda el token en una variable de entorno o en un gestor de secretos, nunca en el código fuente.
- Añade
.enva.gitignoreantes del primer commit, no después. - Oculta el token en la salida de los logs.
- Usa tokens distintos para desarrollo y producción, para que un token de prueba filtrado no afecte a usuarios reales.
Si un token se filtra, revócalo
Abre BotFather, ejecuta /revoke y elige el bot. El token anterior deja de funcionar de inmediato y recibes uno nuevo. Rotarlo cuesta unos minutos de inactividad. Dejarlo cuesta el bot. Reescribir el historial de git no ayuda, porque el token ya fue rastreado.
2. Blinda el webhook
Si tu bot usa un webhook, esa URL es un endpoint abierto en internet. Cualquiera que la encuentre puede publicar actualizaciones falsas que parecen tráfico real de Telegram.
- Configura un token secreto. El método
setWebhookacepta un parámetrosecret_token. Telegram lo devuelve luego en el encabezadoX-Telegram-Bot-Api-Secret-Tokende cada solicitud. Rechaza cualquier cosa que no coincida. - Usa HTTPS con un certificado válido. Telegram lo exige, y evita que el contenido se pueda leer en tránsito.
- Usa una ruta imposible de adivinar. Un segmento aleatorio en la URL no es seguridad real por sí solo, pero te saca del escaneo oportunista.
- Limita lo que recibes. El parámetro
allowed_updateste permite suscribirte solo a los tipos de actualización que manejas. Menos superficie, menos procesamiento. - Responde rápido. Confirma la recepción de la solicitud y luego haz el trabajo de forma asíncrona. Los manejadores de webhook lentos son una denegación de servicio esperando a ocurrir.
3. Nunca confíes en el contenido de una actualización
Todo lo que hay dentro de una actualización lo escribió un usuario. El nombre visible, el texto del mensaje, los datos del callback al pulsar un botón. Todo eso es entrada controlada por un atacante.
- Valida los datos del callback en el servidor. Un botón que lleva
order_id=123se puede repetir conorder_id=124. Comprueba que el usuario que pulsa sea el dueño del registro. - Escapa el texto del usuario antes de mostrarlo. Si envías mensajes en modo HTML o Markdown y pegas un nombre visible tal cual, un nombre manipulado puede romper tu formato o inyectar un enlace.
- Parametriza las consultas a la base de datos. Que el texto del chat llegue a una cadena de consulta es el mismo riesgo de inyección que en un formulario web.
- Limita los tamaños que aceptas. Establece límites de longitud de texto y tamaño de archivo antes de procesar nada.
4. Blinda los comandos de administrador
Casi todos los bots acaban teniendo un comando de administrador. Difusión, reembolso, exportar usuarios. Ahí es donde un bot que funciona se convierte en un incidente.
- Comprueba una lista blanca de IDs de usuario en el servidor, guardada en configuración. Nunca infieras el estado de administrador a partir de un nombre de usuario, que se puede cambiar y reutilizar.
- No lo ocultes, verifícalo. Un comando no documentado se descubre en cuanto alguien lo prueba. La ofuscación no es el control.
- Confirma las acciones destructivas con un segundo paso, e incluye lo que va a ocurrir en el texto de confirmación.
- Registra las acciones de administrador con el ID de usuario y la marca de tiempo, para poder responder después a "quién envió esa difusión".
5. Activa el modo privacidad en grupos
Por defecto, un bot añadido a un grupo solo recibe mensajes que son comandos, respuestas a sus propios mensajes o menciones directas. Ese comportamiento por defecto se llama modo privacidad y existe por una buena razón.
Puedes desactivarlo con /setprivacy en BotFather para que el bot vea todos los mensajes del grupo. Hazlo solo si una función realmente lo necesita. Una vez desactivado, tu servidor almacena las conversaciones de otras personas, y esa responsabilidad pasa a ser tuya.
6. Limita tu propia tasa y la de tus usuarios
Telegram aplica sus propios límites, y superarlos te lleva a que te restrinjan o te bloqueen temporalmente. La orientación general de Telegram es de unos 30 mensajes por segundo repartidos entre chats distintos, y unos 20 mensajes por minuto dentro del mismo grupo. Trátalos como techos que conviene dejar con margen, no como objetivos.
- Encola los mensajes salientes en lugar de enviarlos en un bucle continuo.
- Respeta el valor de retry-after cuando la API devuelve un 429, en lugar de reintentar de inmediato.
- Limita también por usuario. Que una sola persona sature un comando no debería poder disparar tus costos ni agotar tu cuota.
- Pon un tiempo de espera en todo lo costoso, como las llamadas a un modelo de IA de pago o un paso de generación de imágenes.
7. Recopila menos datos de usuario
El registro más seguro es el que nunca guardaste. Los bots acumulan por defecto IDs de chat, nombres, números de teléfono y contenido de mensajes, y la mayor parte nunca se usa.
- Guarda el ID de chat y lo que realmente necesitas. Omite el resto.
- No registres el cuerpo completo de los mensajes a menos que tengas un motivo concreto y un límite de retención.
- Define un periodo de retención y elimina los datos según ese calendario.
- Cifra los campos sensibles en reposo y restringe quién puede consultar la base de datos.
- Admite las solicitudes de eliminación. Bajo el RGPD y leyes similares, un usuario puede pedirte que elimines sus datos, y necesitas una forma de hacerlo.
- Indica qué recopilas en una política de privacidad a la que el bot pueda enlazar.
Ten en cuenta que los números de teléfono solo te llegan si el usuario toca un botón de solicitud de contacto. Pedir uno que no necesitas es a la vez un costo de conversión y una responsabilidad.
8. Verifica los datos de Web App y del Login Widget
Si tu bot abre una Telegram Web App o usas el Login Widget en un sitio web, los datos del usuario llegan con un hash. Verifica ese hash en tu servidor usando el token de tu bot antes de confiar en un solo campo. Omitir esta comprobación significa que cualquiera puede hacerse pasar por cualquier usuario editando la solicitud.
9. Vigila también lo aburrido
- Actualiza las dependencias. La mayoría de los compromisos reales llegan a través de una librería, no de Telegram.
- Restringe quién puede desplegar y quién puede leer los secretos de producción.
- Vigila patrones inusuales: un pico en un solo comando, mensajes de un usuario en un bucle continuo, solicitudes que fallan la comprobación del token secreto.
- Ten un plan para el mal día. Revocar el token, detener el webhook, restaurar desde una copia de seguridad. Escríbelo antes de necesitarlo.
La lista de verificación
- El token vive en variables de entorno, no en git, y se oculta en los logs.
- Sabes cómo ejecutar
/revokeen BotFather. - El webhook usa HTTPS y un token secreto que verificas en cada solicitud.
allowed_updatesestá configurado solo con lo que manejas.- Los datos del callback se autorizan en el servidor, no se confían tal cual llegan.
- El texto del usuario se escapa antes de mostrarse en un mensaje con formato.
- Los comandos de administrador comprueban una lista blanca de IDs y quedan registrados.
- El modo privacidad está activo salvo que una función realmente lo requiera desactivado.
- Los mensajes salientes se encolan y se respetan las respuestas 429.
- Guardas el mínimo, eliminas según un calendario y puedes atender una solicitud de eliminación.
- Los payloads de Web App y del Login Widget se verifican con hash.
Olvídate de las partes que salen mal
Con TeleMinute tu token se guarda del lado del servidor, el webhook se gestiona por ti, y no tienes un servidor propio que dejar expuesto. Tú escribes la conversación, nosotros operamos la infraestructura.
Empieza a construir hoySigue leyendo
- Guía de BotFather, incluyendo cómo revocar y rotar un token
- Mejores prácticas para bots de Telegram, la lista de verificación más amplia
- Mejores prácticas de UX para bots de Telegram, para el lado del diseño
Preguntas frecuentes
¿Qué pasa si se filtra el token de mi bot de Telegram?
Quien lo tenga controla el bot por completo. Puede leer los mensajes entrantes, enviar mensajes en tu nombre y cambiar tu webhook para que tu propio servidor deje de recibir actualizaciones. No hay ninguna solicitud de contraseña de por medio.
¿Cómo revoco el token de un bot de Telegram?
Abre BotFather, envía el comando de revocación y elige el bot. El token anterior deja de funcionar de inmediato y recibes uno nuevo. Reescribir el historial de git no ayuda, porque un token filtrado se rastrea en minutos.
¿Mi bot ve todos los mensajes de un grupo?
Solo si desactivas el modo privacidad. Por defecto, un bot en un grupo recibe comandos, respuestas a sus propios mensajes y menciones directas. Desactivar el modo privacidad hace que tu servidor almacene las conversaciones de otras personas.
¿Necesito un token secreto en mi webhook?
Sí. Sin uno, cualquiera que encuentre la URL de tu webhook puede publicar actualizaciones falsas que parecen tráfico real de Telegram. Configura el secreto al registrar el webhook y rechaza las solicitudes cuyo encabezado no coincida.