Jedyny bezpieczny sposób na zrobienie tego
Wszystkie inne odpowiedzi na tej stronie mają wpływ na bezpieczeństwo, o którym musisz wiedzieć.
Jedyna gwarantowana bezpieczna metoda pobierania bieżącej domeny
jest do 𝓼𝓽𝓸𝓻𝓮 𝓲𝓽 𝓲𝓷 𝓪 𝓼𝓮𝓬𝓾𝓻𝓮 𝓵𝓸𝓬𝓪𝓽𝓲𝓸𝓷 𝔂𝓸𝓾𝓻𝓼𝓮𝓵𝓯.
Większość frameworków zajmuje się przechowywaniem domeny za Ciebie, więc będziesz chciał zapoznać się z dokumentacją dla twojego konkretnego frameworka. Jeśli nie korzystasz z frameworka, rozważ przechowywanie domeny w jednym z następujących miejsc:
+ ------------------------------------------------- --- + ----------------------------------- +
| Bezpieczne metody przechowywania domeny | Używany przez |
+ ------------------------------------------------- --- + ----------------------------------- +
| Plik konfiguracyjny | Joomla, Drupal / Symfony |
| Baza danych | WordPress |
| Zmienna środowiskowa | Laravel |
| Rejestr usług | Kubernetes DNS |
+ ------------------------------------------------- --- + ----------------------------------- +
Możesz użyć następujących ... ale są one niebezpieczne
Hakerzy mogą tworzyć te zmienne w dowolnej domenie. Może to prowadzić do zatrucia pamięci podręcznej i ledwo zauważalnych ataków phishingowych.
$_SERVER['HTTP_HOST']
To pobiera domenę z nagłówków żądań, które są otwarte na manipulację przez hakerów . Tak samo z:
$_SERVER['SERVER_NAME']
Można to ulepszyć, jeśli ustawienie Apache usecanonicalname jest wyłączone; w takim przypadku $_SERVER['SERVER_NAME']
nie będzie już można wypełniać dowolnymi wartościami i będzie bezpieczne. Nie jest to jednak domyślne i nie jest tak powszechne w przypadku konfiguracji.
W popularnych systemach
Poniżej przedstawiamy, w jaki sposób można uzyskać bieżącą domenę w następujących frameworkach / systemach:
WordPress
$urlparts = parse_url(home_url());
$domain = $urlparts['host'];
Jeśli tworzysz adres URL w WordPress, po prostu użyj home_url lub site_url lub dowolnej innej funkcji adresu URL .
Laravel
request()->getHost()
request()->getHost
Funkcja jest dziedziczona z Symfony, i był bezpieczny od 2013 r CVE-2013-4752 została załatana.
Drupal
Instalator nie zadbał jeszcze o zapewnienie bezpieczeństwa ( numer 2404259 ). Ale w Drupalu 8 jest dokumentacja, którą możesz śledzić w Ustawieniach zaufanego hosta, aby zabezpieczyć swoją instalację Drupala, po czym można użyć następujących elementów:
\Drupal::request()->getHost();
Inne ramy
Możesz edytować tę odpowiedź, aby uwzględnić, jak uzyskać bieżącą domenę w ulubionym frameworku. Czyniąc to, dołącz link do odpowiedniego kodu źródłowego lub do czegokolwiek innego, co pomogłoby mi sprawdzić, czy framework działa bezpiecznie.
Uzupełnienie
Przykłady wykorzystania:
Zatruwanie pamięci podręcznej może się zdarzyć, jeśli botnet stale żąda strony, używając niewłaściwego nagłówka hosta. Wynikowy kod HTML będzie następnie zawierał łącza do witryny internetowej osoby atakującej, z której mogą wyłudzić użytkowników. Początkowo złośliwe odsyłacze będą odsyłane tylko do hakera, ale jeśli haker wykona wystarczającą liczbę żądań, złośliwa wersja strony trafi do pamięci podręcznej, gdzie zostanie rozesłana do innych użytkowników.
Atak phishingowy może się zdarzyć, jeśli przechowujesz linki w bazie danych na podstawie nagłówka hosta. Załóżmy na przykład, że przechowujesz bezwzględny adres URL do profili użytkownika na forum. Używając niewłaściwego nagłówka, haker może skłonić każdego, kto kliknie łącze do jego profilu, w celu wysłania strony phishingowej.
Zatrucie resetowania hasła może się zdarzyć, jeśli haker użyje nagłówka złośliwego hosta podczas wypełniania formularza resetowania hasła dla innego użytkownika. Ten użytkownik otrzyma następnie wiadomość e-mail zawierającą łącze do resetowania hasła, które prowadzi do witryny phishingowej.
Oto kilka bardziej złośliwych przykładów
Dodatkowe ostrzeżenia i uwagi:
- Kiedy usecanonicalname jest wyłączone,
$_SERVER['SERVER_NAME']
jest wypełniane tym samym nagłówkiem, $_SERVER['HTTP_HOST']
który zostałby użyty i tak (plus port). To jest domyślna konfiguracja Apache. Jeśli ty lub devops włączysz to, wszystko w porządku - tak - ale czy naprawdę chcesz polegać na oddzielnym zespole lub na sobie za trzy lata, aby zachować to, co wydawałoby się drobną konfiguracją w innym -domyślna wartość? Mimo że zapewnia to bezpieczeństwo, ostrzegałbym przed poleganiem na tej konfiguracji.
- Jednak Redhat domyślnie włącza tryb kanoniczny [ źródło ].
- Jeśli serverAlias jest używany we wpisie hostów wirtualnych i zażądano domeny z aliasem ,
$_SERVER['SERVER_NAME']
nie zwróci bieżącej domeny, ale zwróci wartość dyrektywy serverName.
- Jeśli nie można rozwiązać nazwy_serwera, zamiast niej używana jest komenda nazwa_hosta systemu operacyjnego [źródło] .
- Jeśli nagłówek hosta zostanie pominięty, serwer będzie się zachowywał tak, jakby usecanonical znajdował się na [source] .
- Wreszcie, po prostu próbowałem wykorzystać to na moim lokalnym serwerze i nie mogłem sfałszować nagłówka hosta. Nie jestem pewien, czy pojawiła się aktualizacja Apache, która rozwiązała ten problem, czy po prostu robiłem coś źle. Niezależnie od tego nagłówek ten byłby nadal możliwy do wykorzystania w środowiskach, w których nie są używane wirtualne hosty.
Mała Rant:
To pytanie otrzymało setki tysięcy wyświetleń bez ani jednej wzmianki o problemach z bezpieczeństwem! Nie powinno tak być, ale tylko dlatego, że odpowiedź przepełnienia stosu jest popularna, nie oznacza to, że jest bezpieczna.