Bagaimana server web tahu apakah Anda menggunakan akses alamat IP langsung?

64

Beberapa server web, ketika diakses menggunakan alamat IP mereka, mengembalikan kesalahan yang tidak memungkinkan akses alamat IP langsung.

Saya sudah lama bertanya-tanya bagaimana cara kerjanya. Maksud saya, bukankah browser selalu menyelesaikan alamat IP dan menghubungkannya? Bukankah "Akses alamat IP langsung" hanya melewatkan DNS? Bagaimana server jarak jauh bahkan tahu Anda melewatkan DNS?

Joseph A.
sumber
2
Seingat saya, apa yang dia benar-benar minta ditambahkan ke protokol http sangat awal, untuk menyediakan server virtual pada host nyata yang sama.
JDługosz
3
Ini pada dasarnya proses yang sama yang memungkinkan server tunggal untuk membedakan antara host virtual yang berbeda. Server sebenarnya memetakan URL ke salah satu host virtualnya. Banyak server tidak memiliki cadangan untuk URL yang tidak dipetakan, baik secara desain atau standar.
Manngo
Anda dapat melewati DNS tetapi menghindari kesalahan ini jika Anda membuat entri dalam file host Anda untuk nama domain yang dimaksud. Browser Anda akan mencari nama domain, dan akan memasukkannya dalam header Host:, tetapi tidak ada permintaan DNS akan dibuat karena entri file host.
Monty Harder
Jawaban untuk pertanyaan-pertanyaan semacam ini biasanya, karena Anda memberi tahu mereka .
Thomas

Jawaban:

91

Untuk menjawab pertanyaan Anda tentang bagaimana ia mengetahui , itu ada hubungannya dengan apa yang browser Anda kirim ke server.

Anda benar bahwa sistem selalu mengatasinya ke alamat IP, tetapi browser mengirim URL yang Anda coba akses di header HTTP.

Berikut adalah contoh tajuk yang saya temukan daring, dimodifikasi agar seolah-olah Anda menggunakan Firefox di Windows dan mengetik apple.comdi bilah alamat:

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

Seperti apa tajuknya jika Anda menggunakan alamat IP-nya:

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

Keduanya akan dikirim ke alamat IP yang sama melalui soket, tetapi browser memberi tahu server apa yang diakses.

Mengapa? Karena server web dengan alamat IP yang sama dapat meng-host beberapa situs dan memberikan halaman berbeda untuk masing-masing situs. Itu tidak dapat membedakan siapa yang ingin halaman mana dengan alamat IP karena mereka semua memiliki halaman yang sama - tetapi itu bisa membedakan mereka dengan header HTTP.

iAdjunct
sumber
7
Ahh, jauh lebih masuk akal sekarang! Jadi pada dasarnya, browser mengirim ke IP header dengan IP atau domain, dan situs membuat asumsi tentang itu. Jadi sungguh, pembatasan ini mudah dilewati?
Joseph A.
7
Bukannya itu batasan yang Anda lewati, hanya saja Anda tidak bermain bola dan Anda akan mendapatkan beberapa hasil aneh.
iAdjunct
Permintaan HTTP ini adalah apa yang akan Anda dapatkan jika Anda menggunakan proxy. Tanpa proksi, informasi masuk di hostheader. Lihat contoh ini .
0xFE
2
bytec0de: Bagian lain dari ini adalah bahwa konfigurasi server web akan sering diatur berdasarkan nama host. Paket IP menentukan alamat IP, segmen TCP menentukan nomor port, dan header HTTP menentukan nama host. Jadi umumnya server dikonfigurasikan untuk mengatakan "jika klien / browser meminta example.com, maka berikan ini." Mereka dapat diatur untuk juga menanggapi alamat IP atau wildcard (menanggapi apa pun), tetapi banyak orang hanya menyalin contoh, dan banyak contoh yang sudah ada sebelumnya didasarkan pada nama domain yang disediakan oleh browser.
TOOGAM
14
@ bytec0de Ini bukan batasan . Ini lebih seperti menggunakan nomor telepon yang benar, tetapi ekstensi yang salah - Anda menelepon gedung yang tepat, tetapi bukan orang yang tepat. Dan alasan untuk pengenalannya juga hampir sama dengan telepon - ini memungkinkan Anda untuk meng-host beberapa situs terpisah pada alamat IP yang sama (dan port TCP). Misalnya, server pengembangan kami menampung ratusan situs web secara bersamaan, dan banyak solusi hosting web menggunakan pendekatan yang sama ("daftarkan domain, arahkan ke alamat IP kami, kami akan mengurus sisanya") .
Luaan
21

Dengan protokol HTTP 1.1 (versi HTTP 1.0 sebelumnya telah usang cukup lama, jadi tidak mungkin digunakan oleh versi browser terbaru), hostheader diperkenalkan. Untuk HTTP 1.1, itu adalah baris tajuk yang diperlukan yang harus dikeluarkan oleh browser . Nama domain disertakan oleh browser di baris itu, mis Host: example.com. Jadi server web tahu situs web mana yang ingin diakses browser dari baris itu. Karena server web mungkin mendukung lusinan situs web, baris itu penting untuk menentukan situs web mana yang dihuni oleh halaman yang diminta. Andaikata peramban ingin mengakses halaman beranda untuk situs di example.com, ia mengeluarkan baris berikut ke server ketika terhubung ke server:

GET / HTTP/1.1

Baris itu menentukan keinginan browser untuk mendapatkan dokumen root, yaitu, "/" untuk situs web. Jika Anda ingin mengakses /somedir/testpage.html, GET /somedir/testpage.htmlakan berada di baris "get". Baris akan diikuti oleh baris di bawah ini:

Host: example.com

Jadi jika server web mendukung situs web example.com, someothersite.com, yetanothersite.org, dll., Ia tahu bahwa ia harus mengembalikan halaman utama untuk example.com. Jika tidak mendapatkan baris itu, atau tidak memiliki nama domain yang terdaftar di Hostbaris itu, ia tidak tahu beranda situs web mana yang harus dikembalikan. Jadi, ia mungkin mengembalikan pesan kesalahan, atau mengembalikan halaman beranda untuk situs "default" untuk server.

Anda dapat mengeluarkan perintah yang sama dengan masalah peramban menggunakan protokol telnet , misalnya, telnet example.com 80dari prompt shell Linux atau jendela Apple OS X Terminal , untuk menyambung ke port HTTP default, port 80 - lihat Menguji akses ke situs web menggunakan Putty untuk langkah-langkah untuk melakukannya dengan Putty pada sistem Windows.

titik bulan
sumber
3
Hanya sebuah catatan: header host juga digunakan dalam HTTP 1.0, hanya saja tidak diperlukan . HTTP 1.1 menjadikan bidang wajib diisi. Dalam praktiknya, banyak server HTTP 1.0 tidak berfungsi jika browser tidak mengirim header host (untuk semua alasan yang diuraikan di atas), jadi sebagian besar browser tetap mengirimkannya.
Luaan
6

Ini karena Host:tajuk HTTP. Ini cukup berguna untuk meng-hosting beberapa situs pada alamat IP yang sama. Misalnya, http://www.k7dxs.net/ dan http://www.philipgrimes.com/ keduanya memiliki alamat IP yang sama. Namun, karena Host:tajuk, mereka dapat menampilkan dua situs yang berbeda.

Untuk HTTPS, seperti yang ditunjukkan @Toothbrush, mereka menggunakan Indikasi Nama Server TLS karena header Host adalah bagian dari permintaan terenkripsi, dan server tidak tahu sertifikat mana yang akan ditawarkan tanpa ini.

Eksperimen yang menyenangkan: Dapatkan Data Tamper untuk Firefox (Saya belum dapat menemukan yang setara untuk Chrome) dan mulai merusak. Buka http://slipstation.com/ dan edit Host:tajuk dalam permintaan untuk menjadi http://www.zombo.com/ . Anda akan melihat situs web yang mungkin dikenal di mana segala sesuatu mungkin terjadi.

Duncan X Simpson
sumber
Sebenarnya, situs-situs itu menggunakan Indikasi Nama Server . Tidak ada cara untuk mengatakan situs apa yang akan ditampilkan jika kedua situs di-host di server yang sama melalui HTTPS tanpa SNI karena server tidak tahu sertifikat mana yang digunakan.
Sikat gigi
Oh Menarik. Apakah eksperimen saya masih berfungsi?
Duncan X Simpson
Ya, jika Anda menemukan dua situs yang dihosting di alamat IP yang sama melalui HTTP.
Sikat gigi
Tapi bukan HTTPS yang saya tanyakan.
Duncan X Simpson
Tidak, itu seharusnya tidak berfungsi pada HTTPS. Jika ya, ada kerentanan keamanan di server web.
Sikat gigi
5

Server web dapat dikonfigurasikan untuk hanya menerima koneksi ke domain atau subdomain tertentu. Bisa jadi hosting beberapa domain.

Apa yang dilakukan server web ketika alamat IP langsung digunakan dapat dikonfigurasi. Dalam kasus Apache, secara default akan pergi ke vhost pertama bernama dari situs yang diaktifkan, yang diurutkan secara alfa-numerik.

Ini adalah bagian paling relevan dari dokumentasi Apache yang saya temukan, setelah pencarian cepat:

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

paradroid
sumber