Salta ai contenuti

Allowlist dei link e blocco del contenuto

La tua chiave pubblica è visibile nel codice del tuo sito, quindi chiunque può copiarla e chiamare direttamente l’API. Per un modulo di contatto va benissimo: l’email arriva sempre a te. Le cose cambiano quando un modello prende il destinatario dai parametri (una conferma di iscrizione alla newsletter, una risposta automatica, una conferma d’ordine): chi possiede la chiave pubblica potrebbe inviare il tuo modello – dal tuo dominio, con il tuo marchio – a qualsiasi indirizzo, compilandone testo e link. È così che funziona il phishing.

La regola di Frontmail è quindi: destinatario dinamico ⇒ contenuto bloccato. Puoi comunque inviare a un destinatario scelto nel browser, ma chi chiama l’API non può trasformare il tuo modello in un’email di phishing.

Richiesta Bloccato
chiave pubblica + modello i cui A/CC/CCN usano parametri (Consenti destinatario dinamico attivo) sì
risposta automatica (va sempre all’indirizzo del modulo) sì – link e campi del mittente
chiave privata (il tuo server) no, a meno che il modello non abbia Consenti solo link a domini consentiti
chiave pubblica + modello con destinatario fisso (modulo di contatto) no – si applica solo la regola del mittente

Un modello con Consenti destinatario dinamico attivo ma con indirizzi fissi in A/CC/CCN non è bloccato.

  1. Il CAPTCHA è obbligatorio. Il modello deve avere Richiedi CAPTCHA attivo, altrimenti la richiesta fallisce con 403 dynamic_recipient_requires_captcha. Il CAPTCHA usa le tue chiavi Turnstile. Se non puoi usare il CAPTCHA, invia il modello dal tuo server con una chiave privata.
  2. Mittente fisso. Indirizzo del mittente, nome del mittente e Reply-To non devono usare parametri – 403 dynamic_field_not_allowed.
  3. Nessun markup dal chiamante, testi brevi. I parametri di tipo HTML non possono essere compilati e ogni valore di testo può avere al massimo 500 caratteri (parametri URL 2.048; una Lunghezza max. inferiore impostata sul parametro resta valida) – 422 invalid_template_params con details.reason: "content_locked".
  4. Link solo verso domini consentiti – vedi sotto – 403 link_not_allowed.
  5. Limite per destinatario. Al massimo 5 email per indirizzo destinatario al giorno (UTC), configurabile in Sicurezza → Email per destinatario al giorno (1–1.000). Oltre il limite: 429 rate_limited con details.scope: "recipient". Le risposte automatiche condividono il contatore: oltre il limite non viene creata alcuna risposta automatica.

Ogni controllo avviene prima che venga consumato un credito. Per le risposte automatiche, un controllo non superato segna la risposta automatica come failed (con il codice di errore nella cronologia), il credito viene rimborsato e non viene inviato nulla.

Un link è consentito quando il suo dominio:

  • è scritto direttamente nel modello (HTML, versione testuale o oggetto) – non generato da un segnaposto. https://acme.com/reset?token={{token}} consente acme.com; {{reset_url}} o https://{{sub}}.acme.com non consentono nulla;
  • è nella lista dei domini consentiti (Sicurezza → Siti consentiti);
  • è in Sicurezza → Domini consentiti per i link – uno per riga, example.com (esattamente quell’host) o *.example.com (sottodomini, non il dominio principale) – con le stesse regole dei domini consentiti;
  • è il dominio di Frontmail (il piè di pagina Inviato con Frontmail del piano Free).

mailto:, tel: e qualsiasi altro link non web (javascript:, data:, …) sono consentiti solo quando lo stesso identico link è scritto nel modello.

Dopo il rendering, Frontmail raccoglie ogni URL che un client di posta potrebbe aprire o trasformare in un link:

  • href, src, srcset, action, formaction, background, poster e gli altri attributi URL, anche dentro i commenti condizionali di Outlook;
  • url() e @import CSS negli attributi style e in <style>, e <meta http-equiv="refresh">;
  • URL e domini senza schema nel testo HTML, nella versione testuale e nell’oggetto – i client di posta trasformano in link evil.com/login o www.evil.com, quindi anche questi contano come link.

Prima del confronto, gli URL vengono normalizzati come li leggerebbe un browser: le entità HTML e gli escape CSS vengono decodificati, i caratteri invisibili rimossi, \ trattato come /, //host senza protocollo risolto, le informazioni utente eliminate (https://acme.com@evil.com è evil.com), la codifica percentuale decodificata, maiuscole e punti finali rimossi, e i domini internazionalizzati confrontati in punycode – un sosia come аcme.com con una а cirillica non corrisponde a acme.com (l’errore lo segnala con idn: true).

L’errore elenca in details.hosts solo i domini incriminati – mai gli URL completi, che potrebbero contenere token.

  • I domini senza schema vengono rilevati con una lista di terminazioni note che non sono domini (report.pdf, index.html e Node.js non sono link), quindi un testo come Mr.Smith può essere considerato il dominio mr.smith. Le terminazioni preferite dal phishing che sono anche domini reali (.zip, .mov) contano sempre.
  • I semplici indirizzi email nel testo (giulia@example.com) non vengono trattati come link.
  • Il controllo riguarda dove portano i link, non il testo che li circonda. Per i moduli pubblici mantieni i testi brevi e il limite per destinatario basso.

Attiva Consenti solo link a domini consentiti nelle impostazioni del modello (Impostazioni → Protezione) per applicare il controllo dei link a ogni richiesta, inclusi gli invii con chiave privata. È attivo per impostazione predefinita nei modelli della galleria con destinatario dinamico.

Per ogni richiesta con chiave pubblica, l’indirizzo del mittente del modello non deve provenire dai parametri (altrimenti 403 dynamic_field_not_allowed). Un modulo di contatto che inserisce l’indirizzo del visitatore in Reply-To continua a funzionare – è il posto giusto per quell’indirizzo. L’editor dei modelli ti avvisa di tutto questo in Controlli.