Come fanno i server Web a sapere se si sta utilizzando l'accesso diretto all'indirizzo IP?


64

Alcuni server Web, quando si accede utilizzando il proprio indirizzo IP, restituiscono un errore che non è consentito l'accesso diretto all'indirizzo IP.

Mi chiedo da tempo come funziona. Voglio dire, il browser non risolve sempre l'indirizzo IP e si connette ad esso? "L'accesso diretto all'indirizzo IP" non sta semplicemente saltando il DNS? Come fa il server remoto a sapere che hai saltato il DNS?


2
Per quanto ricordo, ciò che ha veramente chiesto è stato aggiunto molto presto al protocollo http, al fine di fornire server virtuali sullo stesso host reale.
JDługosz,

3
È sostanzialmente lo stesso processo che consente a un singolo server di distinguere tra diversi host virtuali. Il vero server associa un URL a uno dei suoi host virtuali. Molti server non hanno un fallback per un URL non mappato, sia in base alla progettazione che per impostazione predefinita.
Manngo,

È possibile saltare DNS ma evitare questo errore se si crea una voce nel file hosts per il nome di dominio in questione. Il tuo browser cercherà il nome di dominio e lo includerà nell'intestazione Host: ma non verrà effettuata alcuna query DNS a causa della voce del file hosts.
Monty Harder,

La risposta a questo tipo di domande di solito è, perché hai detto loro .
Thomas

Risposte:


91

Per rispondere alla tua domanda su come sa , ha a che fare con ciò che il tuo browser invia al server.

Hai ragione che il sistema lo risolve sempre in un indirizzo IP, ma il browser invia l'URL a cui hai tentato di accedere nell'intestazione HTTP.

Ecco un esempio di intestazione che ho trovato online, modificato per sembrare che tu abbia usato Firefox su Windows e digitato apple.comnella barra degli indirizzi:

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

Ecco come sarebbe l'intestazione se si usasse il suo indirizzo 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

Entrambi questi verrebbero inviati allo stesso indirizzo IP su un socket, ma il browser comunica al server a cosa ha avuto accesso.

Perché? Poiché i server Web con lo stesso indirizzo IP possono ospitare più siti e fornire pagine diverse per ciascuno. Non è in grado di distinguere chi desidera quale pagina in base all'indirizzo IP perché hanno tutte la stessa, ma può distinguerli dall'intestazione HTTP.


7
Ah, ora ha molto più senso! Quindi, fondamentalmente, il browser invia all'IP l'intestazione con l'IP o il dominio, e il sito ne fa il presupposto. Quindi davvero, queste restrizioni sono facili da aggirare?
Joseph A.

7
Non è una limitazione che stai bypassando, è solo che non stai giocando a pallone e otterrai strani risultati.
iAdjunct

Queste richieste HTTP sono quelle che otterresti se stai usando un proxy. Senza un proxy, le informazioni vengono fornite hostnell'intestazione. Vedere questo esempio .
0xFE,

2
bytec0de: l'altra parte di ciò è che le configurazioni del web server saranno spesso impostate in base al nome host. Il pacchetto IP specifica l'indirizzo IP, il segmento TCP specifica il numero di porta e l'intestazione HTTP specifica il nome host. Quindi comunemente i server sono configurati per dire "se il client / browser chiede example.com, allora dai loro questo". Possono essere configurati per rispondere anche a indirizzi IP o caratteri jolly (rispondere a qualsiasi cosa), ma molte persone copiano solo esempi e molti esempi preesistenti si basano sul nome di dominio fornito dal browser.
TOOGAM,

14
@ bytec0de Non è una restrizione . È più come usare il numero di telefono corretto, ma l'estensione sbagliata: hai chiamato l'edificio giusto, ma non la persona giusta. E la ragione della sua introduzione è praticamente la stessa dei telefoni: ti consente di ospitare più siti separati sullo stesso indirizzo IP (e porta TCP). Ad esempio, il nostro server di sviluppo ha ospitato contemporaneamente centinaia di siti Web separati e molte soluzioni di web hosting utilizzano lo stesso approccio ("registra un dominio, indicalo al nostro indirizzo IP, al resto ci pensiamo noi") .
Luaan,

21

Con il protocollo HTTP 1.1 (la precedente versione HTTP 1.0 è stata obsoleta per un po 'di tempo, quindi è improbabile che venga utilizzata da qualsiasi versione recente di un browser), è hoststata introdotta l' intestazione. Per HTTP 1.1 questa è una riga di intestazione obbligatoria che deve essere emessa da un browser . Il nome di dominio è incluso dal browser in quella riga, ad es Host: example.com. Quindi il web server sa a quale sito web il browser vuole accedere da quella linea. Poiché un server web può supportare dozzine di siti Web, tale linea è importante per determinare su quale sito Web risiede la pagina richiesta. Supponendo che il browser desideri accedere alla home page di un sito su example.com, invia la seguente riga al server quando si collega al server:

GET / HTTP/1.1

Tale riga specifica che il browser desidera ottenere il documento radice, ovvero "/" per il sito Web. Se si desidera accedere /somedir/testpage.html, GET /somedir/testpage.htmlsarebbe nella riga "get". La linea sarà seguita dalla linea seguente:

Host: example.com

Quindi, se il server Web supporta i siti Web example.com, someothersite.com, Yetanothersite.org, ecc., Sa che dovrebbe restituire la pagina principale per example.com. Se non ottiene quella riga o non ha un nome di dominio elencato nella Hostriga, non sa quale home page del sito Web debba essere restituita. Quindi potrebbe restituire un messaggio di errore o restituire la home page per un sito "predefinito" per il server.

È possibile emettere gli stessi comandi che un browser emette utilizzando il protocollo telnet , ad esempio telnet example.com 80da un prompt della shell Linux o una finestra del terminale Apple OS X , per connettersi alla porta HTTP predefinita, porta 80 - vedere Test dell'accesso a un sito Web utilizzando PuTTY per i passaggi farlo con PuTTY su un sistema Windows.


3
Solo una nota: l'intestazione host è stata utilizzata anche in HTTP 1.0, non era richiesta . HTTP 1.1 ha reso obbligatorio il campo. In pratica, molti server HTTP 1.0 semplicemente non funzionavano se il browser non inviava l'intestazione host (per tutti i motivi indicati sopra), quindi la maggior parte dei browser lo ha inviato comunque.
Luaan,

6

Ciò è dovuto all'intestazione Host:HTTP. Questo è abbastanza utile per ospitare più siti sullo stesso indirizzo IP. Ad esempio, http://www.k7dxs.net/ e http://www.philipgrimes.com/ sono entrambi sullo stesso indirizzo IP. Tuttavia, a causa Host:dell'intestazione, possono mostrare due siti diversi.

Per HTTPS, come ha sottolineato @Toothbrush, usano l'indicazione del nome del server TLS perché l'intestazione Host fa parte della richiesta crittografata e il server non sa quale certificato offrire senza questo.

Esperimento divertente: ottieni i dati Tamper per Firefox (non sono stato in grado di trovare un equivalente per Chrome) e inizia a manomettere. Apri http://slipstation.com/ e modifica l' Host:intestazione nella richiesta di essere http://www.zombo.com/ . Vedrai un sito web probabilmente familiare dove tutto è possibile.


In realtà, tali siti utilizzano l' indicazione del nome del server . Non è possibile stabilire quale sito visualizzare se entrambi i siti sono ospitati sullo stesso server su HTTPS senza SNI poiché il server non è a conoscenza del certificato da utilizzare.
Spazzolino da denti

Oh interessante. Il mio esperimento funzionerà ancora?
Duncan X Simpson,

Sì, se trovi due siti ospitati sullo stesso indirizzo IP su HTTP.
Spazzolino da denti

Ma non HTTPS è quello che stavo chiedendo.
Duncan X Simpson,

No, non dovrebbe funzionare su HTTPS. In tal caso, esiste una vulnerabilità della sicurezza nel server Web.
Spazzolino da denti

5

Il server Web può essere configurato per accettare connessioni solo a un determinato dominio o sottodominio. Potrebbe ospitare più domini.

Ciò che il server Web fa quando viene utilizzato un indirizzo IP diretto è configurabile. Nel caso di Apache, per impostazione predefinita passerà al primo vhost denominato dai siti abilitati, che sono ordinati in ordine alfabetico.

Questa è la parte più rilevante della documentazione di Apache che ho trovato, dopo una rapida ricerca:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.