Ir al contenido

Orígenes permitidos

Los orígenes permitidos (una lista de dominios permitidos) garantizan que tu clave pública solo funcione en tus propios sitios web. Cada solicitud con clave pública se comprueba contra la lista usando la cabecera Origin del navegador (o Referer cuando falta Origin). Las solicitudes desde otros orígenes se rechazan con 403 origin_not_allowed y no gastan créditos.

Los orígenes permitidos están disponibles en todos los planes, incluido Free.

Los propietarios y administradores añaden entradas en Seguridad → Sitios web permitidos: escribe un dominio, haz clic en Añadir (una entrada cada vez, hasta 100) y guarda. Las entradas se comparan con el host del origen de la solicitud; el esquema (http/https) no importa.

Entrada Coincide con
example.com https://example.com y http://example.com en cualquier puerto, pero no www.example.com
*.example.com cualquier subdominio: www.example.com, shop.eu.example.com, pero no el propio example.com
localhost desarrollo local en cualquier puerto
localhost:3000 solo ese puerto
127.0.0.1 desarrollo local mediante IP
my-app.pages.dev despliegues de vista previa en un proveedor de hosting

Añade tanto example.com como *.example.com si necesitas el dominio raíz y los subdominios.

Las apps nativas (React Native, Flutter, Swift, Kotlin) no envían ni Origin ni Referer, así que la API pública las rechaza por defecto (igual que EmailJS, que bloquea las solicitudes que no vienen de un navegador salvo que las habilites). Para enviar desde una app con la clave pública, activa Seguridad → Apps móviles → Permitir apps móviles (desactivado por defecto) y haz clic en Guardar. A partir de ahí:

Solicitud Apps móviles desactivadas, lista vacía Apps móviles desactivadas, lista configurada Apps móviles activadas, lista vacía Apps móviles activadas, lista configurada
Origin / Referer en la lista aceptada aceptada aceptada aceptada
Origin / Referer fuera de la lista aceptada 403 origin_not_allowed aceptada 403 origin_not_allowed
sin Origin ni Referer (app nativa, servidor, curl) 403 origin_not_allowed 403 origin_not_allowed aceptada aceptada
Origin: null aceptada 403 origin_not_allowed aceptada 403 origin_not_allowed

El error de una solicitud sin Origin lleva details.reason: "no_origin". Permitir las apps móviles también decide qué clave de CAPTCHA verifica esas solicitudes: solo con el interruptor activado se comprueban contra el widget móvil compartido de Frontmail (consulta Turnstile).

Las solicitudes que llevan Origin o Referer siempre se comprueban contra la lista, así que activar el interruptor no debilita la protección de tus sitios web. Origin: null (iframes en sandbox, páginas file://) no se considera una app móvil. Turnstile sigue siendo obligatorio en todas las plantillas que lo tengan activado. El cambio queda registrado en el registro de auditoría como security.updated.

Los navegadores establecen Origin por sí mismos y los scripts no pueden falsificarlo, así que la lista impide que otros sitios web incrusten tu clave. Sin embargo, un script que se ejecute fuera de un navegador (curl, un bot) sí puede enviar cualquier cabecera Origin. Por eso los orígenes permitidos son una capa más, combinada con Turnstile, los límites de solicitudes y la protección contra bots.

Las solicitudes con clave privada se saltan la comprobación de origen: vienen de servidores, que no tienen origen. Una solicitud con clave privada que sí lleva cabecera Origin viene de una página web, donde cualquier visitante puede leer la clave; se rechaza con 403 private_key_in_browser salvo que actives Permitir claves privadas en navegadores (consulta Claves).

  • Funciona en local y falla en producción: añade el dominio de producción (y la variante www.).
  • Falla en una app nativa o desde un script de servidor (403 origin_not_allowed, details.reason: "no_origin"): activa Permitir apps móviles para las apps; en los servidores usa una clave privada.
  • Falla en un WebView móvil o en una extensión del navegador: el origen puede ser null, file:// o chrome-extension://…. Envía desde tu backend con una clave privada.
  • Falla tras una extensión de privacidad que elimina Referer: los navegadores modernos siempre envían Origin en las solicitudes POST, así que es poco habitual; revisa la solicitud en las DevTools.