Salta ai contenuti

Domini consentiti

I domini consentiti (una allowlist di domini) garantiscono che la tua chiave pubblica funzioni solo sui tuoi siti. Ogni richiesta con chiave pubblica viene confrontata con la lista usando l’header Origin del browser (oppure Referer quando Origin manca). Le richieste da altre origini vengono rifiutate con 403 origin_not_allowed e non consumano crediti.

I domini consentiti sono disponibili su tutti i piani, incluso Free.

Proprietari e admin aggiungono le voci in Sicurezza → Siti consentiti: scrivi un dominio, fai clic su Aggiungi (una voce alla volta, fino a 100) e salva. Le voci vengono confrontate con l’host dell’origine della richiesta; lo schema (http/https) non conta.

Voce Corrisponde a
example.com https://example.com e http://example.com su qualsiasi porta – ma non www.example.com
*.example.com qualsiasi sottodominio: www.example.com, shop.eu.example.com – ma non example.com stesso
localhost sviluppo locale su qualsiasi porta
localhost:3000 solo quella porta
127.0.0.1 sviluppo locale tramite IP
my-app.pages.dev deploy di anteprima presso un provider di hosting

Aggiungi sia example.com sia *.example.com se ti servono il dominio principale e i sottodomini.

Le app native (React Native, Flutter, Swift, Kotlin) non inviano né Origin né Referer, quindi l’API pubblica le rifiuta per impostazione predefinita (come EmailJS, che blocca le richieste non provenienti da browser finché non le abiliti). Per inviare da un’app con la chiave pubblica, attiva Sicurezza → App mobile → Consenti app mobile (disattivato per impostazione predefinita) e fai clic su Salva. A quel punto:

Richiesta App mobile off, lista vuota App mobile off, lista impostata App mobile on, lista vuota App mobile on, lista impostata
Origin / Referer nella lista accettata accettata accettata accettata
Origin / Referer non nella lista accettata 403 origin_not_allowed accettata 403 origin_not_allowed
né Origin né Referer (app nativa, server, curl) 403 origin_not_allowed 403 origin_not_allowed accettata accettata
Origin: null accettata 403 origin_not_allowed accettata 403 origin_not_allowed

L’errore per una richiesta senza Origin ha details.reason: "no_origin". Consentire le app mobile decide anche quale chiave CAPTCHA verifica queste richieste: solo con l’interruttore attivo vengono verificate con il widget mobile condiviso di Frontmail (vedi Turnstile).

Le richieste che portano un Origin o un Referer vengono sempre confrontate con la lista, quindi attivare l’interruttore non indebolisce la protezione dei tuoi siti. Origin: null (iframe in sandbox, pagine file://) non viene considerato un’app mobile. Turnstile resta obbligatorio per ogni modello in cui è attivo. La modifica viene registrata nel registro attività come security.updated.

I browser impostano Origin da soli e gli script non possono falsificarlo, quindi la allowlist impedisce ad altri siti di incorporare la tua chiave. Uno script eseguito fuori da un browser (curl, un bot) può però inviare qualsiasi header Origin. Ecco perché i domini consentiti sono solo uno strato, combinato con Turnstile, i rate limit e la protezione dai bot.

Le richieste con una chiave privata saltano il controllo dell’origine: arrivano dai server, che non hanno un’origine. Una richiesta con chiave privata che porta un header Origin arriva da una pagina web, dove ogni visitatore può leggere la chiave; viene rifiutata con 403 private_key_in_browser, a meno che tu non attivi Consenti chiavi private nei browser (vedi Chiavi).

  • Funziona in locale, fallisce in produzione: aggiungi il dominio di produzione (e la variante www.).
  • Fallisce in un’app nativa o da uno script server (403 origin_not_allowed, details.reason: "no_origin"): per le app attiva Consenti app mobile; sui server usa una chiave privata.
  • Fallisce in una WebView mobile o in un’estensione del browser: l’origine potrebbe essere null, file:// o chrome-extension://…. Invia invece dal tuo backend con una chiave privata.
  • Fallisce dietro un’estensione per la privacy che rimuove il Referer: i browser moderni inviano sempre Origin nelle richieste POST, quindi è raro; controlla la richiesta nei DevTools.