Przejdź do głównej zawartości

Dozwolone linki i blokada treści

Twój klucz publiczny jest widoczny w kodzie strony, więc każdy może go skopiować i wywoływać API bezpośrednio. W przypadku formularza kontaktowego to nie problem: e-mail zawsze trafia do ciebie. Inaczej jest, gdy szablon bierze odbiorcę z parametrów (potwierdzenie zapisu do newslettera, automatyczna odpowiedź, potwierdzenie zamówienia): każdy, kto ma klucz publiczny, mógłby wtedy wysłać twój szablon – z twojej domeny, z twoim logo – na dowolny adres i wstawić do niego własny tekst i linki. Tak właśnie działa phishing.

Dlatego we Frontmail obowiązuje zasada: dynamiczny odbiorca ⇒ zablokowana treść. Nadal możesz wysyłać do odbiorcy wybranego w przeglądarce, ale wywołujący nie zrobi z twojego szablonu phishingowego e-maila.

Żądanie Zablokowana
klucz publiczny + szablon, którego Do/DW/UDW korzysta z parametrów (włączone Zezwól na dynamicznego odbiorcę) tak
automatyczna odpowiedź (zawsze trafia na adres z formularza) tak – linki i pola nadawcy
klucz prywatny (twój serwer) nie, chyba że szablon ma Zezwalaj tylko na linki do dozwolonych domen
klucz publiczny + szablon ze stałym odbiorcą (formularz kontaktowy) nie – obowiązuje tylko reguła dla nadawcy

Szablon, który ma włączone Zezwól na dynamicznego odbiorcę, ale w Do/DW/UDW stałe adresy, nie jest zablokowany.

  1. CAPTCHA jest obowiązkowa. Szablon musi mieć włączone Wymagaj CAPTCHA, w przeciwnym razie żądanie kończy się błędem 403 dynamic_recipient_requires_captcha. CAPTCHA korzysta z twoich własnych kluczy Turnstile. Jeśli nie możesz użyć CAPTCHA, wysyłaj szablon ze swojego serwera kluczem prywatnym.
  2. Stały nadawca. Adres nadawcy, nazwa nadawcy i Reply-To nie mogą korzystać z parametrów – 403 dynamic_field_not_allowed.
  3. Żadnego HTML od wywołującego, krótkie teksty. Parametrów typu HTML nie da się wypełnić, a każda wartość tekstowa ma najwyżej 500 znaków (parametry URL 2048; mniejsza Maks. długość parametru nadal obowiązuje) – 422 invalid_template_params z details.reason: "content_locked".
  4. Linki tylko do dozwolonych domen – zobacz niżej – 403 link_not_allowed.
  5. Limit na odbiorcę. Najwyżej 5 e-maili na adres odbiorcy dziennie (UTC), do ustawienia w Bezpieczeństwo → E-maile na odbiorcę dziennie (1–1000). Po przekroczeniu limitu: 429 rate_limited z details.scope: "recipient". Automatyczne odpowiedzi korzystają z tego samego licznika – po przekroczeniu limitu automatyczna odpowiedź nie powstaje.

Wszystkie sprawdzenia odbywają się zanim zostanie zużyty kredyt. W przypadku automatycznych odpowiedzi nieudane sprawdzenie oznacza odpowiedź jako failed (z kodem błędu w historii), kredyt jest zwracany i nic nie zostaje wysłane.

Link jest dozwolony, gdy jego domena jest:

  • wpisana bezpośrednio w szablonie (HTML, wersja tekstowa lub temat) – a nie wstawiona przez placeholder. https://acme.pl/reset?token={{token}} dopuszcza acme.pl; {{reset_url}} ani https://{{sub}}.acme.pl nie dopuszczają niczego;
  • na liście dozwolonych domen (Bezpieczeństwo → Dozwolone domeny);
  • w Bezpieczeństwo → Dozwolone domeny linków – jedna w wierszu, example.com (dokładnie ten host) albo *.example.com (subdomeny, bez domeny głównej) – te same zasady co przy dozwolonych domenach;
  • własną domeną Frontmail (stopka Wysłano przez Frontmail w planie Free).

mailto:, tel: i wszystkie inne linki spoza sieci WWW (javascript:, data:, …) są dozwolone tylko wtedy, gdy dokładnie ten sam link jest wpisany w szablonie.

Po wyrenderowaniu Frontmail zbiera każdy URL, który klient poczty mógłby otworzyć albo zamienić w link:

  • href, src, srcset, action, formaction, background, poster i inne atrybuty z URL-ami, także wewnątrz komentarzy warunkowych dla Outlooka;
  • CSS url() i @import w atrybutach style i w <style> oraz <meta http-equiv="refresh">;
  • URL-e i gołe domeny w tekście HTML, w wersji tekstowej i w temacie – klienty poczty same zamieniają evil.com/login czy www.evil.com w linki, więc one też się liczą.

Przed porównaniem URL-e są normalizowane tak, jak odczytałaby je przeglądarka: dekodowane są encje HTML i escape’y CSS, usuwane niewidoczne znaki, \ traktowany jak /, rozwiązywane //host bez protokołu, odrzucana część z danymi logowania (https://acme.pl@evil.com to evil.com), dekodowane kodowanie procentowe, usuwane wielkie litery i kropki na końcu, a domeny międzynarodowe porównywane w punycode – podróbka аcme.pl z cyrylicką а nie pasuje do acme.pl (błąd oznacza ją idn: true).

Błąd podaje w details.hosts tylko problematyczne domeny – nigdy pełne URL-e, które mogą zawierać tokeny.

  • Gołe domeny są rozpoznawane na podstawie listy znanych końcówek, które domenami nie są (report.pdf, index.html ani Node.js to nie linki), więc tekst typu Mr.Smith może zostać uznany za domenę mr.smith. Końcówki lubiane przez phisherów, które są też prawdziwymi domenami (.zip, .mov), liczą się zawsze.
  • Zwykłe adresy e-mail w tekście (jan@example.com) nie są traktowane jak linki.
  • Sprawdzenie dotyczy tego, dokąd prowadzą linki, a nie tekstu wokół nich. W publicznych formularzach trzymaj teksty krótkie, a limit na odbiorcę niski.

Włącz Zezwalaj tylko na linki do dozwolonych domen w ustawieniach szablonu (Ustawienia → Ochrona), żeby sprawdzanie linków obejmowało każde żądanie, także wysyłki z kluczem prywatnym. W szablonach z galerii z dynamicznym odbiorcą jest to włączone domyślnie.

W każdym żądaniu z kluczem publicznym adres nadawcy w szablonie nie może pochodzić z parametrów (inaczej 403 dynamic_field_not_allowed). Formularz kontaktowy, który wstawia adres odwiedzającego do Reply-To, działa dalej – to właściwe miejsce na niego. Edytor szablonów ostrzega o tym wszystkim w sekcji Kontrole.