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.
Configuración
Sección titulada «Configuración»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.
Apps móviles
Sección titulada «Apps móviles»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.
Qué protege y qué no
Sección titulada «Qué protege y qué no»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).
Solución de problemas
Sección titulada «Solución de problemas»- 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://ochrome-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íanOriginen las solicitudesPOST, así que es poco habitual; revisa la solicitud en las DevTools.