---
title: "Escáneres de enlaces y secretos de un solo uso | Blog de LinkPilot"
url: https://uselinkpilot.com/es/blog/link-scanners-and-one-time-secrets
description: "Si un enlace de un solo uso se destruye con un GET, muere en la vista previa de Slack o del correo. Responde con metadatos y destruye solo al mostrarlo."
lang: es
---

Seguridad (https://uselinkpilot.com/es/blog/category/security)

# Escáneres de enlaces y secretos de un solo uso

Si un enlace de un solo uso se destruye con un GET, muere en la vista previa de Slack o del correo. Responde con metadatos y destruye solo al mostrarlo.

W. Miller (https://uselinkpilot.com/es/author/w-miller)26 de mayo de 2026 · Actualizado el 22 de octubre de 2026 · Sobre LinkPilot (https://uselinkpilot.com/es/about)

Un enlace de un solo uso que se destruye con un simple `GET` muere en cuanto Slack, Teams o una pasarela de correo lo abre para generar una vista previa. La solución es devolver solo metadatos con `GET` y destruir el secreto con un `POST` explícito para mostrarlo, con una frase de contraseña enviada por un segundo canal como red de seguridad. Este artículo explica qué sistemas abren enlaces sin preguntar y cómo diseñar pensando en todos ellos.

El generador de enlaces secretos de un solo uso (https://uselinkpilot.com/es/tools/free-secret-link-generator) de LinkPilot funciona así: una petición para generar una vista previa solo recibe la estructura de la página; el secreto se descarga, y la vista se cuenta, cuando un navegador ejecuta la página.

## El error por defecto

La mayoría de los clientes de chat y de correo intentan generar una vista previa cuando ven una URL. El proceso es este:

1. Alguien pega el enlace secreto en Slack.
2. El generador de vistas previas de Slack abre la URL (hace un `GET`; Slack documenta este comportamiento en link unfurling (https://api.slack.com/reference/messaging/link-unfurling)).
3. El código que muestra el secreto trata la petición como la visita de una persona, destruye el secreto y devuelve el contenido.
4. Slack recibe el contenido ya destruido (o una página genérica) y lo muestra.
5. La persona hace clic en el enlace, ve «ya visto» y le pide otro al remitente.

El generador de vistas previas no tenía mala intención. El código confundió «alguien ha abierto la URL» con «el destinatario ha leído el secreto». Son hechos distintos, y todo el problema de diseño consiste en mantenerlos separados.

En el paso 3 se esconde una variante peor: si el `GET` del generador de vistas previas recibió el contenido real, el secreto está ahora dentro de la infraestructura de un tercero que genera vistas previas. En el mejor de los casos, se descartó después de crear la vista previa. Pero no tienes forma de confirmarlo, ni ningún evento de auditoría que te avise de que ocurrió.

## ¿Quién abre un enlace antes que el destinatario?

Los generadores de vistas previas de los chats, las pasarelas de seguridad del correo, la protección de los dispositivos, los proxies corporativos y las extensiones de vista previa, y casi siempre más de uno. Decir que «Slack genera vistas previas» se queda corto. Una URL pegada en un entorno de trabajo actual suele pasar por varios sistemas antes de que una persona haga clic:

| Quién la abre | Cuándo | ¿Se puede identificar? |
| --- | --- | --- |
| Generadores de vistas previas de chat (Slack, Teams, iMessage, WhatsApp, LinkedIn) | En cuanto se envía el mensaje | Normalmente sí, con user agents propios como `Slackbot-LinkExpanding` |
| Pasarelas de seguridad del correo (Mimecast, Proofpoint, Microsoft Defender) | Al entregar el correo, y a menudo otra vez en el momento del clic | A menudo no: muchas usan user agents de navegadores reales |
| Protección del dispositivo / antivirus | Cuando la URL llega al dispositivo del destinatario | Rara vez |
| Proxies web corporativos | En el momento del clic, antes de reenviar la petición de la persona | Rara vez |
| Extensiones de navegador que muestran vistas previas de enlaces | Al pasar el ratón o al cargar la página | No: usan la propia sesión del navegador de la persona |

El comportamiento de cada proveedor en esta tabla cambia con el tiempo, así que toma lo que se dice de cada pasarela como «según lo publicado en julio de 2026; compruébalo con la documentación actual». Lo que tienen en común no cambia: todos estos sistemas hacen un simple `GET`, porque es la única forma segura y universal de ver una URL que no controlas.

## ¿Cómo evitas que una vista previa destruya un enlace de un solo uso?

Responde con metadatos al `GET` y destruye el secreto solo con un `POST` explícito. La semántica de HTTP ya lo prevé: RFC 9110, apartado 9.2.1 (https://www.rfc-editor.org/rfc/rfc9110#section-9.2.1) define `GET` como seguro e idempotente, es decir, una petición que cualquiera puede hacer libremente porque no debe cambiar nada. `POST` es el verbo de acción. Así que trata el acto de mostrar el secreto como una acción `POST` detrás de un botón visible:

```http
GET  /s/abc123   →  HTML page: "Click to reveal this secret"
POST /s/abc123   →  burns the secret, returns the payload
```

Ahora el `GET` de Slack devuelve una página neutra con metadatos. El secreto solo se destruye cuando la persona hace clic en el botón. Cualquier escáner que respete la semántica de HTTP no llega a tocar el contenido. Eso incluye a casi todos, porque hacer `POST` con efectos sobre URL arbitrarias rompería media web.

## Un recorrido paso a paso

Sigamos un enlace de principio a fin. Creas un secreto que se destruye tras la primera lectura y tiene frase de contraseña, y pegas la URL en un mensaje directo de Slack y en un correo.

1. **El generador de vistas previas de Slack** hace `GET /s/abc123`. Respuesta: una pequeña página de metadatos (estado activo, frase de contraseña obligatoria). No se registra ninguna vista. El secreto sigue vivo.
2. **La pasarela de correo del destinatario** reescribe la URL del correo y la abre en el momento de la entrega para analizar su reputación. El mismo `GET`, los mismos metadatos. Sigue vivo.
3. **El destinatario hace clic en el enlace del correo.** El escáner de la pasarela la abre una vez más en el momento del clic (`GET`) y después redirige al navegador.
4. **El navegador carga la página para mostrar el secreto**, con otro `GET`. La página muestra un botón para mostrarlo y un campo para la frase de contraseña. Sigue sin registrarse ninguna vista.
5. **El destinatario escribe la frase de contraseña y hace clic en el botón.** El navegador hace `POST /s/abc123`. Se registra la vista, se devuelve el contenido y el secreto se destruye.
6. **Quien abra la URL después** recibe una respuesta explícita de «ya visto y destruido» en lugar del contenido.

Cinco peticiones, una sola lectura. Esa proporción es normal en un entorno corporativo. Un diseño que no la tolere fallará el primer día, y el remitente acabará pegando la contraseña directamente en el chat.

## Defensas por capas

### La separación entre GET y POST

Cubre todos los generadores de vistas previas y escáneres que se portan bien, que son la inmensa mayoría del tráfico automatizado. Es la base; todo lo que sigue añade profundidad.

### La frase de contraseña

Cubre lo que la separación no puede: sandboxes que ejecutan JavaScript e interactúan con la página, además de clics accidentales de personas y correos reenviados. Un sandbox de detonación puede hacer clic en un botón; no puede escribir una frase de contraseña que viajó por otro canal. Envía el enlace por correo y la frase de contraseña por un mensaje directo de Slack o por SMS.

### Filtrado de bots por user agent

Descarta los bots de vista previa conocidos (`Slackbot`, `LinkedInBot`, `Twitterbot`) antes de que lleguen al código que muestra el secreto. Merece la pena como protección adicional, pero nunca basta por sí solo: los escáneres de seguridad usan de forma habitual user agents de navegadores reales precisamente para que las páginas maliciosas no puedan ocultarse del análisis.

### Expiración corta

Limita el periodo en que puede haber daños. Si un enlace duró quince minutos, los escáneres, los archivos de registro y el historial del chat se quedan con una URL que ya no lleva a nada.

### Cache-Control: no-store

Ponlo en todas las respuestas que muestran el secreto para que ningún intermediario (proxy corporativo, CDN, caché del navegador) guarde una copia del contenido después de la única lectura legítima.

## El caso concreto de las pasarelas de seguridad del correo

Las pasarelas corporativas merecen un apartado propio porque abren el enlace dos veces. Los productos de este tipo (Microsoft Defender Safe Links (https://learn.microsoft.com/en-us/defender-office-365/safe-links-about) es el ejemplo documentado) reescriben todas las URL del correo entrante para que pasen por su propio dominio de análisis. Lo normal es que la URL se abra una vez en la entrega, para analizar su reputación, y otra vez en el momento del clic, antes de redirigir a la persona al destino real.

Si cualquiera de esas dos peticiones destruyera el secreto, el destinatario vería _siempre_ un enlace muerto, un error que a los usuarios les parece aleatorio pero que es totalmente determinista. La separación entre `GET` y `POST` absorbe las dos peticiones sin ningún problema, porque las dos son simples `GET`. La redirección en el momento del clic lleva después a la persona a la página para mostrar el secreto, que es donde se hace el `POST`.

## Casos límite que siguen dando problemas

- **Sandboxes que ejecutan JavaScript.** Algunos entornos de detonación cargan la página e interactúan con ella. En teoría, un sandbox agresivo podría hacer clic en un `POST` detrás de un botón _sin frase de contraseña_. La frase de contraseña es la red de seguridad.
- **Enlace y frase de contraseña por el mismo canal.** Si los dos van en un mismo correo, todas las defensas anteriores se reducen a «esperar que nadie lea ese correo». Sepáralos siempre en canales distintos.
- **Reenvíos.** Cada reenvío a otro chat u otro sistema de correo provoca una nueva ronda de vistas previas. Con la separación no hacen daño, pero cada salto deja otro conjunto de registros con la URL, y eso es un argumento a favor de una expiración corta.
- **Lecturas simultáneas.** Si dos personas hacen clic para mostrar el secreto a la vez, la lectura y la destrucción tienen que hacerse en un solo paso indivisible: exactamente una petición gana y la otra recibe «ya visto». Una implementación que las haga por separado puede entregar el contenido dos veces.

## Prueba tu propia herramienta

Antes de confiar credenciales reales a cualquier servicio para compartir secretos, haz esta comprobación de dos minutos:

1. Crea un secreto desechable con la destrucción tras la lectura activada.
2. Ábrelo desde un terminal, que es justo lo que hace un generador de vistas previas: `curl -s -o /dev/null -w "%{http_code}" "<url>"`
3. Abre el enlace en un navegador. Si ves «ya visto», la herramienta destruye el secreto con un `GET` y no es seguro pegar sus enlaces en un chat o un correo.
4. Si ha sobrevivido, muéstralo de la forma normal en el navegador y vuelve a hacer `curl`: ahora deberías recibir una respuesta explícita de que ya no existe o se ha destruido, no el contenido.

## Cómo lo implementa LinkPilot

Para que conste, este es el diseño que usan los enlaces secretos de LinkPilot: un `GET` al endpoint que muestra el secreto devuelve solo metadatos (el estado y si hace falta una frase de contraseña), y solo se registra una vista con un `POST` explícito. Las frases de contraseña se convierten en un hash SHA-256 en el cliente y tienen un límite de cinco intentos por IP, por minuto y por secreto. Todas las respuestas que muestran el secreto llevan `Cache-Control: no-store`, los secretos destruidos o expirados devuelven HTTP 410 con el contenido almacenado sobrescrito, y el historial de auditoría registra cada evento con la IP convertida en hash con una sal que cambia cada día. La IP sin procesar no se guarda nunca. Todos los detalles están en la página de arquitectura de seguridad (https://uselinkpilot.com/es/security-architecture).

Pruébalo gratis, sin registro

### Mensaje que se autodestruye

Envía una nota que desaparece después de leerse una vez.

Abrir herramienta (https://uselinkpilot.com/es/tools/burn-after-read-secret)

## Límites de este diseño

Con sinceridad, estos son sus límites: nada de lo anterior protege un secreto _después_ de una lectura legítima, porque el destinatario puede copiar el contenido, hacer una captura de pantalla o reenviarlo. No sirve de nada si la frase de contraseña viaja con el enlace. Y no puede impedir que una persona que recibió el enlace por error lo abra antes que el destinatario previsto. Para eso está el historial de auditoría: ves la vista inesperada y rotas la credencial.

## Lecturas relacionadas

- Cómo funcionan los enlaces secretos de un solo uso: https://uselinkpilot.com/es/blog/how-one-time-secret-links-work
- Por qué las URL filtran información confidencial: https://uselinkpilot.com/es/blog/why-urls-leak-sensitive-information
- Arquitectura de seguridad de LinkPilot: https://uselinkpilot.com/es/security-architecture

## Referencias

- IETF, RFC 9110: HTTP Semantics, section 9.2.1 Safe Methods (https://www.rfc-editor.org/rfc/rfc9110#section-9.2.1).
- Slack API, Unfurling links in messages (https://api.slack.com/reference/messaging/link-unfurling).
- Microsoft Learn, Safe Links in Microsoft Defender for Office 365 (https://learn.microsoft.com/en-us/defender-office-365/safe-links-about).

## Herramientas para este artículo

Mensaje que se autodestruye

Envía una nota que desaparece después de leerse una vez.
https://uselinkpilot.com/es/tools/burn-after-read-secret

Generador de enlaces secretos de un solo uso

Comparte una contraseña o una nota con un enlace que solo se abre una vez.
https://uselinkpilot.com/es/tools/free-secret-link-generator

Generador de enlaces que expiran

Crea enlaces que dejan de funcionar en el momento que fijes.
https://uselinkpilot.com/es/tools/temporary-link

## Preguntas frecuentes

### ¿Qué clientes causan más problemas?

### ¿Puedo detectar por el user agent a los generadores de vistas previas?

### ¿Separar GET y POST lo resuelve del todo?

### ¿Los escáneres de correo llegan a hacer clic en los botones de la página?

### ¿Cómo compruebo si una herramienta para compartir secretos resiste las vistas previas?

## LinkPilot envía un enlace secreto que desaparece en cuanto se abre.

Cifrado en tu navegador, se muestra una vez y después se destruye. Sin cuenta.

Crear un enlace secreto (https://uselinkpilot.com/es/tools/free-secret-link-generator)

## Sigue leyendo

Seguridad

### Cómo compartir claves de API de forma segura

No pegues una clave de API en un chat ni en un correo. Envía un enlace secreto de un solo uso, cifrado en tu navegador, y rota la clave que ya pegaste.
https://uselinkpilot.com/es/blog/how-to-share-api-keys-securely

Seguridad

### Cómo funcionan los enlaces secretos de un solo uso

Un enlace secreto de un solo uso muestra el secreto una vez: el navegador lo cifra, el servidor solo guarda texto cifrado y la primera lectura lo destruye.
https://uselinkpilot.com/es/blog/how-one-time-secret-links-work

Seguridad

### Enlaces que expiran: destruir el secreto, no solo redirigir

Al expirar, un enlace secreto destruye el secreto; un enlace corto expirado solo deja de redirigir. Cómo elegir el plazo y los casos límite.
https://uselinkpilot.com/es/blog/expiring-links-security

## Structured data

```json
[
  {
    "@context": "https://schema.org",
    "@type": "BreadcrumbList",
    "itemListElement": [
      {
        "@type": "ListItem",
        "position": 1,
        "name": "Inicio",
        "item": "https://uselinkpilot.com/es"
      },
      {
        "@type": "ListItem",
        "position": 2,
        "name": "Blog",
        "item": "https://uselinkpilot.com/es/blog"
      },
      {
        "@type": "ListItem",
        "position": 3,
        "name": "Escáneres de enlaces y secretos de un solo uso",
        "item": "https://uselinkpilot.com/es/blog/link-scanners-and-one-time-secrets"
      }
    ]
  },
  {
    "@context": "https://schema.org",
    "@type": "BlogPosting",
    "@id": "https://uselinkpilot.com/es/blog/link-scanners-and-one-time-secrets#article",
    "headline": "Escáneres de enlaces y secretos de un solo uso",
    "description": "Si un enlace de un solo uso se destruye con un GET, muere en la vista previa de Slack o del correo. Responde con metadatos y destruye solo al mostrarlo.",
    "inLanguage": "es",
    "datePublished": "2026-05-26",
    "dateModified": "2026-10-22",
    "image": "https://uselinkpilot.com/logo-512.png",
    "author": {
      "@type": "Person",
      "@id": "https://uselinkpilot.com/author/w-miller#person",
      "name": "W. Miller",
      "url": "https://uselinkpilot.com/es/author/w-miller",
      "worksFor": {
        "@type": "Organization",
        "name": "LinkPilot",
        "url": "https://uselinkpilot.com"
      }
    },
    "publisher": {
      "@type": "Organization",
      "name": "LinkPilot",
      "url": "https://uselinkpilot.com",
      "logo": {
        "@type": "ImageObject",
        "url": "https://uselinkpilot.com/logo-512.png",
        "width": 512,
        "height": 512
      }
    },
    "mainEntityOfPage": {
      "@type": "WebPage",
      "@id": "https://uselinkpilot.com/es/blog/link-scanners-and-one-time-secrets"
    }
  },
  {
    "@context": "https://schema.org",
    "@type": "FAQPage",
    "mainEntity": [
      {
        "@type": "Question",
        "name": "¿Qué clientes causan más problemas?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Cualquiera que genere vistas previas de las URL: Slack, Microsoft Teams, iMessage, los mensajes directos de LinkedIn, las vistas previas de WhatsApp Web y la mayoría de las pasarelas de seguridad del correo (Mimecast, Proofpoint, Microsoft Defender). Todos abren la URL en cuanto la reciben."
        }
      },
      {
        "@type": "Question",
        "name": "¿Puedo detectar por el user agent a los generadores de vistas previas?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "En parte. Los bots que se portan bien envían user agents identificables (Slackbot-LinkExpanding, LinkedInBot, Twitterbot). Los escáneres de seguridad suelen hacerse pasar por navegadores reales, así que filtrar por user agent no basta por sí solo."
        }
      },
      {
        "@type": "Question",
        "name": "¿Separar GET y POST lo resuelve del todo?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Resuelve por completo el caso de las vistas previas, porque esos sistemas solo hacen peticiones GET. No resuelve el caso de una persona que hace clic por error y destruye el secreto: para eso también necesitas la frase de contraseña."
        }
      },
      {
        "@type": "Question",
        "name": "¿Los escáneres de correo llegan a hacer clic en los botones de la página?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Algunos sandboxes de detonación ejecutan JavaScript y pueden interactuar con una página, así que un simple botón para mostrar el secreto no es una garantía. Por eso importa la frase de contraseña: un sandbox no puede escribir una frase de contraseña que viajó por otro canal."
        }
      },
      {
        "@type": "Question",
        "name": "¿Cómo compruebo si una herramienta para compartir secretos resiste las vistas previas?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Crea un secreto desechable, abre su URL una vez con curl (un simple GET, justo lo que hace un generador de vistas previas) y después ábrela en un navegador. Si el navegador muestra «ya visto», la herramienta destruye el secreto con un GET y no es seguro pegar sus enlaces en un chat o un correo."
        }
      }
    ],
    "inLanguage": "es"
  },
  {
    "@context": "https://schema.org",
    "@type": "SoftwareApplication",
    "@id": "https://uselinkpilot.com/#software",
    "name": "LinkPilot",
    "applicationCategory": "BusinessApplication",
    "operatingSystem": "Web",
    "description": "LinkPilot is a secure link management platform for creating branded short links, tracking engagement, and sharing secrets with expiring, protected, self-destructing links.",
    "url": "https://uselinkpilot.com",
    "offers": [
      {
        "@type": "Offer",
        "name": "Free",
        "price": "0",
        "priceCurrency": "USD",
        "url": "https://uselinkpilot.com/pricing"
      },
      {
        "@type": "Offer",
        "name": "Pro",
        "price": "29",
        "priceCurrency": "USD",
        "priceSpecification": {
          "@type": "UnitPriceSpecification",
          "price": "29",
          "priceCurrency": "USD",
          "billingDuration": "P1M"
        },
        "url": "https://uselinkpilot.com/pricing"
      },
      {
        "@type": "Offer",
        "name": "Agency",
        "price": "299",
        "priceCurrency": "USD",
        "priceSpecification": {
          "@type": "UnitPriceSpecification",
          "price": "299",
          "priceCurrency": "USD",
          "billingDuration": "P1M"
        },
        "url": "https://uselinkpilot.com/pricing"
      },
      {
        "@type": "Offer",
        "name": "Agency Plus",
        "price": "799",
        "priceCurrency": "USD",
        "priceSpecification": {
          "@type": "UnitPriceSpecification",
          "price": "799",
          "priceCurrency": "USD",
          "billingDuration": "P1M"
        },
        "url": "https://uselinkpilot.com/pricing"
      },
      {
        "@type": "Offer",
        "name": "Pro (yearly)",
        "price": "288",
        "priceCurrency": "USD",
        "priceSpecification": {
          "@type": "UnitPriceSpecification",
          "price": "288",
          "priceCurrency": "USD",
          "billingDuration": "P1Y"
        },
        "url": "https://uselinkpilot.com/pricing"
      },
      {
        "@type": "Offer",
        "name": "Agency (yearly)",
        "price": "2988",
        "priceCurrency": "USD",
        "priceSpecification": {
          "@type": "UnitPriceSpecification",
          "price": "2988",
          "priceCurrency": "USD",
          "billingDuration": "P1Y"
        },
        "url": "https://uselinkpilot.com/pricing"
      },
      {
        "@type": "Offer",
        "name": "Agency Plus (yearly)",
        "price": "7980",
        "priceCurrency": "USD",
        "priceSpecification": {
          "@type": "UnitPriceSpecification",
          "price": "7980",
          "priceCurrency": "USD",
          "billingDuration": "P1Y"
        },
        "url": "https://uselinkpilot.com/pricing"
      },
      {
        "@type": "Offer",
        "name": "Enterprise",
        "priceSpecification": {
          "@type": "PriceSpecification",
          "priceCurrency": "USD"
        },
        "url": "https://uselinkpilot.com/pricing"
      }
    ]
  },
  {
    "@context": "https://schema.org",
    "@type": "Organization",
    "@id": "https://uselinkpilot.com/#organization",
    "name": "LinkPilot",
    "alternateName": "LinkPilot by TetraCore",
    "url": "https://uselinkpilot.com",
    "contactPoint": {
      "@type": "ContactPoint",
      "contactType": "customer support",
      "email": "support@uselinkpilot.com",
      "url": "https://uselinkpilot.com/support"
    },
    "parentOrganization": {
      "@type": "Organization",
      "@id": "https://tetracorehq.com/#organization",
      "name": "TetraCore",
      "url": "https://tetracorehq.com/"
    },
    "logo": {
      "@type": "ImageObject",
      "url": "https://uselinkpilot.com/logo-512.png",
      "width": 512,
      "height": 512
    },
    "description": "LinkPilot is a secure link management platform for creating branded short links, tracking engagement, and sharing secrets with expiring, protected, self-destructing links.",
    "sameAs": [
      "https://x.com/uselinkpilot",
      "https://www.linkedin.com/company/uselinkpilot",
      "https://facebook.com/uselinkpilot",
      "https://github.com/TetraCoreHQ/linkpilot-cli",
      "https://github.com/TetraCoreHQ/linkpilot-mcp",
      "https://www.npmjs.com/package/linkpilot",
      "https://www.npmjs.com/package/@uselinkpilot/sdk",
      "https://www.npmjs.com/package/@uselinkpilot/mcp",
      "https://chromewebstore.google.com/detail/linkpilot-short-links-and/mnmppadihpcncicldpkmgknhnjkondad",
      "https://addons.mozilla.org/en-US/firefox/addon/uselinkpilot/"
    ]
  },
  {
    "@context": "https://schema.org",
    "@type": "WebSite",
    "name": "LinkPilot",
    "url": "https://uselinkpilot.com",
    "potentialAction": {
      "@type": "SearchAction",
      "target": "https://uselinkpilot.com/blog?q={search_term_string}",
      "query-input": "required name=search_term_string"
    }
  }
]
```