Zum Inhalt springen

Erlaubte Domains

Erlaubte Domains (eine Allowlist für Domains) sorgen dafür, dass Ihr öffentlicher Schlüssel nur auf Ihren eigenen Websites funktioniert. Jede Anfrage mit öffentlichem Schlüssel wird anhand des Origin-Headers des Browsers (oder Referer, wenn Origin fehlt) mit der Liste abgeglichen. Anfragen von anderen Origins werden mit 403 origin_not_allowed abgelehnt und verbrauchen keine Credits.

Erlaubte Domains gibt es in jedem Tarif, auch in Free.

Inhaber und Admins tragen Einträge unter Sicherheit → Erlaubte Websites ein: Domain eingeben, auf Hinzufügen klicken (ein Eintrag nach dem anderen, bis zu 100) und speichern. Die Einträge werden mit dem Host des Origins der Anfrage verglichen; das Schema (http/https) spielt keine Rolle.

Eintrag Passt auf
example.com https://example.com und http://example.com auf jedem Port – aber nicht www.example.com
*.example.com jede Subdomain: www.example.com, shop.eu.example.com – aber nicht example.com selbst
localhost lokale Entwicklung auf jedem Port
localhost:3000 nur diesen Port
127.0.0.1 lokale Entwicklung über die IP
my-app.pages.dev Preview-Deployments bei einem Hosting-Anbieter

Tragen Sie sowohl example.com als auch *.example.com ein, wenn Sie die Hauptdomain und Subdomains brauchen.

Native Apps (React Native, Flutter, Swift, Kotlin) senden weder Origin noch Referer, daher lehnt die öffentliche API sie standardmäßig ab (wie EmailJS, das Anfragen außerhalb von Browsern blockiert, solange Sie sie nicht freischalten). Um aus einer App mit dem öffentlichen Schlüssel zu senden, schalten Sie Sicherheit → Mobile Apps → Mobile Apps erlauben ein (standardmäßig aus) und klicken auf Speichern. Dann gilt:

Anfrage Mobile Apps aus, Liste leer Mobile Apps aus, Liste gesetzt Mobile Apps an, Liste leer Mobile Apps an, Liste gesetzt
Origin / Referer steht auf der Liste angenommen angenommen angenommen angenommen
Origin / Referer steht nicht auf der Liste angenommen 403 origin_not_allowed angenommen 403 origin_not_allowed
weder Origin noch Referer (native App, Server, curl) 403 origin_not_allowed 403 origin_not_allowed angenommen angenommen
Origin: null angenommen 403 origin_not_allowed angenommen 403 origin_not_allowed

Der Fehler bei einer Anfrage ohne Origin enthält details.reason: "no_origin". Das Erlauben mobiler Apps entscheidet auch, welcher CAPTCHA-Schlüssel solche Anfragen prüft: Nur bei eingeschaltetem Schalter werden sie mit dem gemeinsamen mobilen Widget von Frontmail geprüft (siehe Turnstile).

Anfragen mit Origin oder Referer werden immer mit der Liste abgeglichen – das Einschalten des Schalters schwächt also den Schutz Ihrer Websites nicht. Origin: null (Iframes mit Sandbox, file://-Seiten) gilt nicht als mobile App. Turnstile bleibt für jede Vorlage erforderlich, bei der es eingeschaltet ist. Die Änderung wird im Audit-Log als security.updated festgehalten.

Browser setzen Origin selbst, und Skripte können ihn nicht fälschen – die Allowlist verhindert also, dass andere Websites Ihren Schlüssel einbetten. Ein Skript außerhalb eines Browsers (curl, ein Bot) kann jedoch einen beliebigen Origin-Header senden. Deshalb sind erlaubte Domains nur eine Schutzschicht, kombiniert mit Turnstile, Rate Limits und dem Bot-Schutz.

Anfragen mit privatem Schlüssel überspringen die Origin-Prüfung – sie kommen von Servern, die keinen Origin haben. Eine Anfrage mit privatem Schlüssel, die doch einen Origin-Header trägt, kommt von einer Webseite, auf der jeder Besucher den Schlüssel lesen kann; sie wird mit 403 private_key_in_browser abgelehnt, sofern Sie nicht Private Schlüssel im Browser erlauben einschalten (siehe Schlüssel).

  • Funktioniert lokal, schlägt in Produktion fehl: Tragen Sie die Produktivdomain (und die www.-Variante) ein.
  • Schlägt in einer nativen App oder aus einem Serverskript fehl (403 origin_not_allowed, details.reason: "no_origin"): Schalten Sie für Apps Mobile Apps erlauben ein; auf Servern verwenden Sie einen privaten Schlüssel.
  • Schlägt in einer mobilen WebView oder Browsererweiterung fehl: Der Origin kann null, file:// oder chrome-extension://… sein. Senden Sie stattdessen von Ihrem Backend mit einem privaten Schlüssel.
  • Schlägt hinter einer Datenschutz-Erweiterung fehl, die Referer entfernt: Moderne Browser senden bei POST-Anfragen immer Origin, das ist also selten; prüfen Sie die Anfrage in den DevTools.