Mam swoją witrynę na serwerze
http://www.myserver.uk.com
Do tego mam dwie domeny,
http://one.com
i
http://two.com
Chciałbym dostać się z bieżącą domeną PHP, ale jeśli używam, $_SERVER['HTTP_HOST']
to pokaż mi
myserver.uk.com
zamiast:
one.com or two.com
Jak mogę uzyskać domenę, a nie nazwę serwera?
Mam PHP w wersji 5.2.
$_SERVER['HTTP_HOST']
. W przypadku witrynone.com
itwo.com
są „przekierowanie” za pomocą (i) ramki, sama strona wciąż pochodzi z myserver.uk.com, więc nie dostaniesz prawdziwą domenę. Do czego służy źródło HTMLone.com
?Odpowiedzi:
Spróbuj użyć tego:
$_SERVER['SERVER_NAME']
Albo przeanalizuj
źródło
HTTP_X_ORIGINAL_HOST
może być modyfikowany przez użytkownika i nie można mu ufać. Nie zawsze może to stanowić problem, ale należy o tym pamiętać.Najlepszym zastosowaniem byłoby
Można go używać w ten sposób:
Poniższy kod to dobry sposób, aby zobaczyć wszystkie zmienne w $ _SERVER w ustrukturyzowanym wyniku HTML z podświetlonymi słowami kluczowymi, które zatrzymują się bezpośrednio po wykonaniu. Ponieważ czasami zapominam, którego użyć, myślę, że to może być fajne.
źródło
Użycie
$_SERVER['HTTP_HOST']
pobiera mnie (subdomena) maindomain.extension. Wydaje mi się, że to najłatwiejsze rozwiązanie.Jeśli faktycznie „przekierowujesz” przez element iFrame, możesz dodać parametr GET określający domenę.
Następnie możesz ustawić zmienną sesji, która utrwala te dane w całej aplikacji.
źródło
Jedyny bezpieczny sposób na zrobienie tego
Wszystkie inne odpowiedzi na tej stronie mają wpływ na bezpieczeństwo, o którym musisz wiedzieć.
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.
To pobiera domenę z nagłówków żądań, które są otwarte na manipulację przez hakerów . Tak samo z:
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
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
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:
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:
$_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.$_SERVER['SERVER_NAME']
nie zwróci bieżącej domeny, ale zwróci wartość dyrektywy serverName.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.
źródło
$urlparts['path']
nie jest ustawiony, jeśli jest zainstalowany w katalogu głównym domeny. W przeciwnym razie$urlparts['path']
zwraca podkatalog.Spróbuj
$_SERVER['SERVER_NAME']
.Wskazówki: Utwórz plik PHP wywołujący tę funkcję
phpinfo()
i zobacz sekcję „Zmienne PHP”. Istnieje wiele przydatnych zmiennych, o których nigdy nie myślimy.źródło
Wiem, że może to nie być do końca na ten temat, ale z mojego doświadczenia wynika, że przechowywanie WWW-ności bieżącego adresu URL w zmiennej jest przydatne.
Edycja: Ponadto, zobacz mój komentarz poniżej, aby zobaczyć, do czego to zmierza.
Jest to ważne przy określaniu, czy wywołania Ajax mają być wysyłane z „www”, czy bez:
Podczas wysyłania połączenia Ajax nazwa domeny musi być zgodna z nazwą domeny w pasku adresu przeglądarki, w przeciwnym razie w konsoli wystąpi błąd Uncaught SecurityError .
Więc wymyśliłem to rozwiązanie, aby rozwiązać problem:
Następnie, w oparciu o to, czy $ WWW jest prawdziwe, czy fałszywe, uruchom odpowiednie wywołanie Ajax.
Wiem, że to może brzmieć banalnie, ale jest to tak powszechny problem, o który łatwo się potknąć.
źródło
window.location
. W PHP maszSERVER_NAME
.Wszyscy używają tej
parse_url
funkcji, ale czasami użytkownik może przekazać argumet w innym formacie.Aby to naprawić, stworzyłem funkcję. Sprawdź to:
Po prostu podaj adres URL i uzyskaj domenę.
Na przykład,
zwróci wynik będzie
A w jakiejś sytuacji:
I to też wróci
stackoverflow.com
.źródło
// aby pobrać domenę
// domena z protokołem
// protokół, domena, queryString łącznie ** Ponieważ $ _SERVER ['SERVER_NAME'] nie jest niezawodne w przypadku hostingu w wielu domenach!
źródło
Po prostu spróbuj:
źródło