Aller au contenu

Domaines autorisés

Les domaines autorisés (une liste blanche de domaines) garantissent que votre clé publique ne fonctionne que sur vos propres sites. Chaque requête avec la clé publique est comparée à la liste à l’aide de l’en-tête Origin du navigateur (ou de Referer si Origin est absent). Les requêtes provenant d’autres origines sont refusées avec 403 origin_not_allowed et ne consomment aucun crédit.

Les domaines autorisés sont disponibles dans tous les forfaits, y compris Free.

Les propriétaires et les administrateurs ajoutent des entrées dans Sécurité → Sites autorisés : saisissez un domaine, cliquez sur Ajouter (une entrée à la fois, jusqu’à 100) et enregistrez. Les entrées sont comparées à l’hôte de l’origine de la requête ; le schéma (http/https) ne compte pas.

Entrée Correspond à
example.com https://example.com et http://example.com sur n’importe quel port – mais pas www.example.com
*.example.com n’importe quel sous-domaine : www.example.com, shop.eu.example.com – mais pas example.com lui-même
localhost développement local sur n’importe quel port
localhost:3000 uniquement ce port
127.0.0.1 développement local via l’adresse IP
my-app.pages.dev déploiements de prévisualisation chez un hébergeur

Ajoutez à la fois example.com et *.example.com si vous avez besoin du domaine principal et des sous-domaines.

Les applications natives (React Native, Flutter, Swift, Kotlin) n’envoient ni Origin ni Referer, l’API publique les refuse donc par défaut (comme EmailJS, qui bloque les requêtes hors navigateur tant que vous ne les autorisez pas). Pour envoyer depuis une application avec la clé publique, activez Sécurité → Applications mobiles → Autoriser les applications mobiles (désactivé par défaut) et cliquez sur Enregistrer. Ensuite :

Requête Applications mobiles désactivées, liste vide Applications mobiles désactivées, liste remplie Applications mobiles activées, liste vide Applications mobiles activées, liste remplie
Origin / Referer dans la liste acceptée acceptée acceptée acceptée
Origin / Referer absent de la liste acceptée 403 origin_not_allowed acceptée 403 origin_not_allowed
ni Origin ni Referer (application native, serveur, curl) 403 origin_not_allowed 403 origin_not_allowed acceptée acceptée
Origin: null acceptée 403 origin_not_allowed acceptée 403 origin_not_allowed

L’erreur d’une requête sans Origin contient details.reason: "no_origin". L’autorisation des applications mobiles détermine aussi quelle clé CAPTCHA vérifie ces requêtes : ce n’est qu’avec l’option activée qu’elles sont vérifiées avec le widget mobile partagé de Frontmail (voir Turnstile).

Les requêtes qui portent un Origin ou un Referer sont toujours comparées à la liste : activer l’option n’affaiblit donc pas la protection de vos sites web. Origin: null (iframes en sandbox, pages file://) n’est pas considéré comme une application mobile. Turnstile reste obligatoire pour chaque modèle où il est activé. La modification est enregistrée dans le journal d’audit sous security.updated.

Ce que cela protège (et ce que cela ne protège pas)

Section intitulée « Ce que cela protège (et ce que cela ne protège pas) »

Les navigateurs définissent eux-mêmes l’en-tête Origin et les scripts ne peuvent pas le falsifier : la liste empêche donc d’autres sites d’intégrer votre clé. En revanche, un script exécuté hors d’un navigateur (curl, un bot) peut envoyer n’importe quel en-tête Origin. C’est pourquoi les domaines autorisés ne sont qu’une couche de protection, combinée à Turnstile, aux rate limits et à la protection contre les bots.

Les requêtes avec une clé privée ne passent pas par la vérification de l’origine – elles viennent de serveurs, qui n’ont pas d’origine. Une requête avec clé privée qui porte un en-tête Origin vient d’une page web, où chaque visiteur peut lire la clé ; elle est refusée avec 403 private_key_in_browser, sauf si vous activez Autoriser les clés privées dans les navigateurs (voir Clés).

  • Fonctionne en local, échoue en production : ajoutez le domaine de production (et la variante www.).
  • Échoue dans une application native ou depuis un script serveur (403 origin_not_allowed, details.reason: "no_origin") : activez Autoriser les applications mobiles pour les applications ; sur les serveurs, utilisez une clé privée.
  • Échoue dans une WebView mobile ou une extension de navigateur : l’origine peut être null, file:// ou chrome-extension://…. Envoyez plutôt depuis votre backend avec une clé privée.
  • Échoue derrière une extension de confidentialité qui supprime Referer : les navigateurs modernes envoient toujours Origin sur les requêtes POST, c’est donc rare ; examinez la requête dans les DevTools.