Skąd serwery internetowe wiedzą, czy korzystasz z bezpośredniego dostępu do adresu IP?


64

Niektóre serwery WWW, gdy uzyskuje się do nich dostęp za pomocą adresu IP, zwracają błąd, że bezpośredni dostęp do adresu IP jest niedozwolony.

Od jakiegoś czasu zastanawiam się, jak to działa. Mam na myśli, czy przeglądarka nie zawsze rozpoznaje adres IP i łączy się z nim? Czy „bezpośredni dostęp do adresu IP” nie pomija DNS? Skąd zdalny serwer wie, że pominęłeś DNS?


2
O ile pamiętam, to , o co tak naprawdę prosił, zostało bardzo wcześnie dodane do protokołu http, aby zapewnić serwery wirtualne na tym samym prawdziwym hoście.
JDługosz

3
Zasadniczo jest to ten sam proces, który pozwala jednemu serwerowi rozróżniać różne hosty wirtualne. Prawdziwy serwer mapuje adres URL na jeden z wirtualnych hostów. Wiele serwerów nie ma rezerwowego dostępu do niezapisanego adresu URL, zarówno z założenia, jak i domyślnie.
Manngo,

Możesz pominąć DNS, ale uniknij tego błędu, jeśli utworzysz wpis w pliku hosts dla danej nazwy domeny. Twoja przeglądarka będzie szukała nazwy domeny i umieści ją w nagłówku Host:, ale zapytanie DNS nie zostanie wykonane z powodu wpisu pliku hosts.
Monty Harder

Odpowiedź na tego rodzaju pytania zazwyczaj brzmi, ponieważ im powiedziałeś .
Thomas

Odpowiedzi:


91

Aby odpowiedzieć na pytanie, skąd to wie , ma to związek z tym, co przeglądarka wysyła do serwera.

Masz rację, że system zawsze rozpoznaje adres IP, ale przeglądarka wysyła adres URL, do którego próbujesz uzyskać dostęp, w nagłówku HTTP.

Oto przykładowy nagłówek, który znalazłem w Internecie, zmodyfikowany tak, aby wyglądał, jakbyś używał Firefoksa w systemie Windows i wpisał apple.comw pasku adresu:

GET / HTTP/1.1
Host: apple.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

Oto jak wyglądałby nagłówek, gdybyś użył jego adresu IP:

GET / HTTP/1.1
Host: 17.142.160.59
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

Oba zostaną wysłane na ten sam adres IP przez gniazdo, ale przeglądarka poinformuje serwer o tym, do czego uzyskał dostęp.

Dlaczego? Ponieważ serwery WWW o tym samym adresie IP mogą hostować wiele witryn i podawać różne strony dla każdej z nich. Nie może rozróżnić, kto chce, która strona ma adres IP, ponieważ wszystkie mają tę samą - ale może odróżnić je według nagłówka HTTP.


7
Ach, ma teraz o wiele więcej sensu! Zasadniczo przeglądarka wysyła do adresu IP nagłówek z adresem IP lub domeną, a witryna przyjmuje na tym założenia. Czy naprawdę te ograniczenia są łatwe do ominięcia?
Joseph A.

7
Nie chodzi o to, że omijasz to ograniczenie, po prostu nie grasz w piłkę i osiągniesz dziwne wyniki.
iDodatkowy

Te żądania HTTP są tym, co otrzymasz, jeśli używasz serwera proxy. Bez serwera proxy informacje znajdują się w hostnagłówku. Zobacz ten przykład .
0xFE

2
bytec0de: Inną kwestią jest to, że konfiguracje serwera WWW będą często konfigurowane na podstawie nazwy hosta. Pakiet IP określa adres IP, segment TCP określa numer portu, a nagłówek HTTP określa nazwę hosta. Dlatego często serwery są skonfigurowane tak, aby powiedzieć „jeśli klient / przeglądarka poprosi o example.com, to im to daj”. Można je skonfigurować tak, aby reagowały również na adresy IP lub symbole wieloznaczne (odpowiadają na cokolwiek), ale wiele osób po prostu kopiuje przykłady, a wiele wcześniejszych przykładów jest opartych na nazwie domeny dostarczonej przez przeglądarkę.
TOOGAM,

14
@ bytec0de To nie jest ograniczenie . To bardziej jak użycie poprawnego numeru telefonu, ale niewłaściwego numeru wewnętrznego - zadzwoniłeś do właściwego budynku, ale nie do właściwej osoby. Powód jego wprowadzenia jest prawie taki sam jak w telefonach - pozwala hostować wiele oddzielnych witryn pod tym samym adresem IP (i portem TCP). Na przykład nasz serwer programistyczny hostował jednocześnie setki odrębnych stron internetowych, a wiele rozwiązań hostingowych korzysta z tego samego podejścia („zarejestruj domenę, wskaż na nasz adres IP, my zajmiemy się resztą”) .
Luaan

21

W przypadku protokołu HTTP 1.1 (poprzednia wersja HTTP 1.0 była już przestarzała, więc jest mało prawdopodobne, aby była używana przez jakąkolwiek najnowszą wersję przeglądarki), hostnagłówek został wprowadzony. W przypadku protokołu HTTP 1.1 jest to wymagany wiersz nagłówka, który musi zostać wydany przez przeglądarkę . Nazwa domeny jest uwzględniona przez przeglądarkę w tym wierszu, np Host: example.com. Tak więc serwer internetowy wie, do której strony internetowej przeglądarka chce uzyskać dostęp z tego wiersza. Ponieważ serwer może obsługiwać dziesiątki stron internetowych, wiersz ten jest dla niego ważny, aby ustalić, na której stronie internetowej znajduje się żądana strona. Załóżmy, że przeglądarka chce uzyskać dostęp do strony głównej witryny w przyklad.com, po połączeniu z serwerem wydaje następujący wiersz:

GET / HTTP/1.1

Ten wiersz określa, że ​​przeglądarka chce uzyskać dokument główny, tj. „/” Dla witryny. Jeśli chcesz uzyskać dostęp /somedir/testpage.html, GET /somedir/testpage.htmlbędzie w linii „get”. Po linii pojawi się linia poniżej:

Host: example.com

Jeśli więc serwer WWW obsługuje witryny example.com, someothersite.com, yetanothersite.org itd., Wie, że powinien zwrócić stronę główną example.com. Jeśli nie otrzyma tego wiersza lub nie ma nazwy domeny wymienionej w Hostwierszu, nie wie, która strona główna witryny powinna zostać zwrócona. Może więc zwrócić komunikat o błędzie lub stronę główną „domyślnej” witryny serwera.

Można wydawać takie samo dowodzi problemy przeglądarce przy użyciu telnet protokół, na przykład telnet example.com 80z linii poleceń powłoki systemu Linux lub Apple OS X Terminal okna, aby podłączyć do standardowego portu HTTP, port 80 - patrz Testowanie dostępu do strony internetowej za pomocą PuTTY do stepów zrobić to z PuTTY w systemie Windows.


3
Tylko uwaga: nagłówek hosta był również używany w HTTP 1.0, po prostu nie był wymagany . W HTTP 1.1 pole było obowiązkowe. W praktyce wiele serwerów HTTP 1.0 po prostu nie działało, jeśli przeglądarka nie wysłała nagłówka hosta (z wszystkich powodów wymienionych powyżej), więc większość przeglądarek i tak go wysłała.
Luaan

6

Wynika to z Host:nagłówka HTTP. Jest to bardzo przydatne w przypadku hostowania wielu witryn pod tym samym adresem IP. Na przykład http://www.k7dxs.net/ i http://www.philipgrimes.com/ są na tym samym adresie IP. Jednak ze względu na Host:nagłówek mogą wyświetlać dwie różne witryny.

W przypadku HTTPS, jak wskazał @Toothbrush, używają wskazania nazwy serwera TLS, ponieważ nagłówek hosta jest częścią zaszyfrowanego żądania, a serwer nie wie, który certyfikat zaoferować bez tego.

Zabawny eksperyment: zdobądź dane manipulacji dla Firefoksa (nie znalazłem odpowiednika dla Chrome) i zacznij manipulować. Otwórz http://slipstation.com/ i edytuj Host:nagłówek w żądaniu na http://www.zombo.com/ . Zobaczysz prawdopodobnie znaną stronę internetową, na której wszystko jest możliwe.


W rzeczywistości strony te używają wskazania nazwy serwera . Nie ma sposobu, aby powiedzieć, która witryna ma być wyświetlana, jeśli obie witryny są hostowane na tym samym serwerze przez HTTPS bez SNI, ponieważ serwer nie wie, którego certyfikatu użyć.
Szczoteczka do zębów

Interesujące. Czy mój eksperyment będzie nadal działać?
Duncan X Simpson

Tak, jeśli znajdziesz dwie witryny hostowane pod tym samym adresem IP przez HTTP.
Szczoteczka do zębów

Ale nie HTTPS jest tym, o co prosiłem.
Duncan X Simpson

Nie, to nie powinno działać przez HTTPS. Jeśli tak, na serwerze WWW występuje luka w zabezpieczeniach.
Szczoteczka do zębów

5

Serwer WWW można skonfigurować tak, aby akceptował tylko połączenia z określoną domeną lub subdomeną. Może to być hosting wielu domen.

To, co robi serwer WWW, gdy używany jest bezpośredni adres IP, można konfigurować. W przypadku Apache domyślnie przejdzie do pierwszego hosta o nazwie vhost spośród włączonych stron, które są posortowane alfanumerycznie.

Jest to najbardziej odpowiednia część dokumentacji Apache, którą znalazłem po szybkim wyszukiwaniu:

https://httpd.apache.org/docs/current/vhosts/name-based.html

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.