Przejdź do głównej zawartości

Dozwolone domeny

Dozwolone domeny (allowlista domen) sprawiają, że twój klucz publiczny działa tylko na twoich własnych stronach. Każde żądanie z kluczem publicznym jest sprawdzane z listą na podstawie nagłówka Origin wysyłanego przez przeglądarkę (albo Referer, gdy Origin brakuje). Żądania z innych domen są odrzucane z błędem 403 origin_not_allowed i nie zużywają kredytów.

Dozwolone domeny są dostępne w każdym planie, także Free.

Właściciel i administratorzy dodają wpisy w Bezpieczeństwo → Dozwolone domeny: wpisują domenę, klikają Dodaj (po jednym wpisie, maksymalnie 100) i zapisują. Wpisy są porównywane z hostem w originie żądania; schemat (http/https) nie ma znaczenia.

Wpis Pasuje do
example.com https://example.com i http://example.com na dowolnym porcie – ale nie www.example.com
*.example.com dowolnej subdomeny: www.example.com, shop.eu.example.com – ale nie samego example.com
localhost lokalnego developmentu na dowolnym porcie
localhost:3000 tylko tego portu
127.0.0.1 lokalnego developmentu przez adres IP
my-app.pages.dev wdrożeń podglądowych (preview) u dostawcy hostingu

Jeśli potrzebujesz domeny głównej i subdomen, dodaj zarówno example.com, jak i *.example.com.

Aplikacje natywne (React Native, Flutter, Swift, Kotlin) nie wysyłają ani Origin, ani Referer, więc publiczne API domyślnie je odrzuca (podobnie jak EmailJS, które blokuje żądania spoza przeglądarki, dopóki ich nie włączysz). Żeby wysyłać z aplikacji z kluczem publicznym, włącz Bezpieczeństwo → Aplikacje mobilne → Zezwól na aplikacje mobilne (domyślnie wyłączone) i kliknij Zapisz. Wtedy:

Żądanie Aplikacje mobilne wył., lista pusta Aplikacje mobilne wył., lista ustawiona Aplikacje mobilne wł., lista pusta Aplikacje mobilne wł., lista ustawiona
Origin / Referer jest na liście przyjęte przyjęte przyjęte przyjęte
Origin / Referer nie ma na liście przyjęte 403 origin_not_allowed przyjęte 403 origin_not_allowed
bez Origin i bez Referer (aplikacja natywna, serwer, curl) 403 origin_not_allowed 403 origin_not_allowed przyjęte przyjęte
Origin: null przyjęte 403 origin_not_allowed przyjęte 403 origin_not_allowed

Błąd dla żądania bez Origin ma details.reason: "no_origin". Zezwolenie na aplikacje mobilne decyduje też o tym, którym kluczem CAPTCHA weryfikujemy takie żądania: wspólnym mobilnym widgetem Frontmail tylko wtedy, gdy przełącznik jest włączony (zobacz Turnstile).

Żądania z nagłówkiem Origin lub Referer są zawsze sprawdzane z listą, więc włączenie przełącznika nie osłabia ochrony twoich stron. Origin: null (iframe’y z sandboxem, strony file://) nie jest traktowany jak aplikacja mobilna. Turnstile jest nadal wymagany dla każdego szablonu, który ma go włączonego. Zmiana trafia do dziennika zdarzeń jako security.updated.

Nagłówek Origin ustawia sama przeglądarka i skrypty nie mogą go podrobić, więc allowlista nie pozwala innym stronom osadzić twojego klucza. Skrypt działający poza przeglądarką (curl, bot) może jednak wysłać dowolny nagłówek Origin. Dlatego dozwolone domeny to tylko jedna warstwa, w połączeniu z Turnstile, rate limitami i ochroną przed botami.

Żądania z kluczem prywatnym pomijają sprawdzanie domeny – pochodzą z serwerów, które nie mają originu. Żądanie z kluczem prywatnym, które ma nagłówek Origin, pochodzi ze strony internetowej, gdzie klucz może odczytać każdy odwiedzający; odrzucamy je z błędem 403 private_key_in_browser, chyba że włączysz Zezwól na klucze prywatne w przeglądarkach (zobacz Klucze).

  • Lokalnie działa, na produkcji nie: dodaj domenę produkcyjną (i wariant z www.).
  • Nie działa w aplikacji natywnej ani ze skryptu na serwerze (403 origin_not_allowed, details.reason: "no_origin"): dla aplikacji włącz Zezwól na aplikacje mobilne, na serwerach używaj klucza prywatnego.
  • Nie działa w mobilnym WebView albo w rozszerzeniu przeglądarki: origin może mieć wartość null, file:// lub chrome-extension://…. Wysyłaj wtedy ze swojego backendu z kluczem prywatnym.
  • Nie działa z rozszerzeniem chroniącym prywatność, które usuwa Referer: nowoczesne przeglądarki przy żądaniach POST zawsze wysyłają Origin, więc zdarza się to rzadko; sprawdź żądanie w DevTools.