เว็บเซิร์ฟเวอร์รู้ได้อย่างไรว่าคุณใช้การเข้าถึงที่อยู่ IP โดยตรง


64

เว็บเซิร์ฟเวอร์บางแห่งเมื่อเข้าถึงโดยใช้ที่อยู่ IP จะส่งคืนข้อผิดพลาดที่ไม่อนุญาตให้เข้าถึงที่อยู่ IP โดยตรง

ฉันสงสัยบางครั้งว่ามันทำงานอย่างไร ฉันหมายความว่าเบราว์เซอร์ไม่สามารถแก้ไขที่อยู่ IP และเชื่อมต่อกับมันได้หรือไม่ ไม่ใช่ "การเข้าถึงที่อยู่ IP โดยตรง" แค่ข้าม DNS ใช่ไหม เซิร์ฟเวอร์ระยะไกลรู้ได้อย่างไรว่าคุณข้าม DNS


2
ตามที่ฉันจำได้สิ่งที่เขาถามจริง ๆนั้นถูกเพิ่มเข้ามาในโปรโตคอล http เร็วมากเพื่อให้เซิร์ฟเวอร์เสมือนในโฮสต์จริงเดียวกัน
JDługosz

3
เป็นกระบวนการเดียวกันที่อนุญาตให้เซิร์ฟเวอร์เดียวแยกความแตกต่างระหว่างโฮสต์เสมือนที่แตกต่างกัน เซิร์ฟเวอร์จริงจับคู่ URL กับโฮสต์เสมือนหนึ่งรายการ เซิร์ฟเวอร์จำนวนมากไม่มีทางเลือกสำหรับ URL ที่ไม่ได้ถูกแมปไม่ว่าจะโดยการออกแบบหรือค่าเริ่มต้น
Manngo

คุณสามารถข้าม DNS แต่หลีกเลี่ยงข้อผิดพลาดนี้หากคุณสร้างรายการในไฟล์โฮสต์ของคุณสำหรับชื่อโดเมนที่เป็นปัญหา เบราว์เซอร์ของคุณจะมองหาชื่อโดเมนและจะรวมไว้ในส่วนหัว Host: แต่จะไม่มีการสืบค้น DNS ใด ๆ เนื่องจากรายการไฟล์โฮสต์
Monty Harder

คำตอบชนิดของคำถามเหล่านี้มักจะเป็นเพราะคุณบอกพวกเขาว่า
โทมัส

คำตอบ:


91

ในการตอบคำถามของคุณเกี่ยวกับวิธีการใช้งานเบราว์เซอร์ของคุณจะส่งเซิร์ฟเวอร์

คุณถูกต้องว่าระบบจะแก้ไขเป็นที่อยู่ IP เสมอ แต่เบราว์เซอร์จะส่ง URL ที่คุณพยายามเข้าถึงในส่วนหัว HTTP

นี่คือส่วนหัวตัวอย่างที่ฉันพบออนไลน์ปรับเปลี่ยนให้ดูเหมือนกับว่าคุณใช้ Firefox บน Windows และพิมพ์apple.comลงในแถบที่อยู่:

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

นี่คือลักษณะที่ส่วนหัวหากคุณใช้ที่อยู่ 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

ทั้งสองอย่างนี้จะถูกส่งไปยังที่อยู่ IP เดียวกันบนซ็อกเก็ต แต่เบราว์เซอร์จะบอกเซิร์ฟเวอร์ว่ามีการเข้าถึงอะไร

ทำไม? เนื่องจากเว็บเซิร์ฟเวอร์ที่มีที่อยู่ IP เดียวกันอาจโฮสต์เว็บไซต์หลายแห่งและมอบหน้าเว็บที่แตกต่างกันสำหรับแต่ละเว็บไซต์ มันไม่สามารถแยกแยะว่าใครต้องการหน้าไหนโดยที่อยู่ IP เพราะพวกเขาทุกคนมีเหมือนกัน - แต่มันสามารถแยกแยะได้ด้วยส่วนหัว HTTP


7
อ่าเข้าใจมากขึ้นแล้ว! เบราว์เซอร์จะส่งส่วนหัวของ IP ไปยัง IP หรือโดเมนจากนั้นเบราว์เซอร์จะส่งข้อมูลไปยังไอพี ดังนั้นข้อ จำกัด เหล่านี้ง่ายต่อการหลีกเลี่ยง
โจเซฟเอ

7
ไม่ใช่ว่ามันเป็นข้อ จำกัด ที่คุณกำลังข้ามมันเป็นเพียงว่าคุณไม่ได้เล่นบอลและคุณจะได้รับผลแปลก ๆ
iAdjunct

คำขอ HTTP เหล่านี้คือสิ่งที่คุณจะได้รับหากคุณใช้พรอกซี ไม่มีพร็อกซีข้อมูลมาในhostส่วนหัว ดูตัวอย่างนี้
0xFE

2
bytec0de: ส่วนอื่น ๆ ของเรื่องนี้คือการกำหนดค่าเว็บเซิร์ฟเวอร์มักจะตั้งค่าตามชื่อโฮสต์ แพ็คเก็ต IP ระบุที่อยู่ IP ส่วน TCP ระบุหมายเลขพอร์ตและส่วนหัว HTTP ระบุชื่อโฮสต์ ดังนั้นเซิร์ฟเวอร์ทั่วไปจึงได้รับการกำหนดค่าให้พูดว่า "ถ้าไคลเอนต์ / เบราว์เซอร์ถาม example.com จากนั้นให้สิ่งเหล่านี้" พวกเขาสามารถตั้งค่าเพื่อตอบสนองต่อที่อยู่ IP หรือสัญลักษณ์แทน (ตอบสนองต่อสิ่งใด ๆ ) แต่หลาย ๆ คนเพียงแค่คัดลอกตัวอย่างและตัวอย่างที่มีอยู่แล้วจำนวนมากจะขึ้นอยู่กับชื่อโดเมนที่เบราว์เซอร์จัดทำ
TOOGAM

14
@ bytec0de มันไม่ได้เป็นข้อ จำกัด มันเหมือนกับการใช้หมายเลขโทรศัพท์ที่ถูกต้อง แต่ส่วนขยายผิด - คุณเรียกว่าสิ่งปลูกสร้างที่เหมาะสม แต่ไม่ใช่คนที่เหมาะสม และสาเหตุของการเปิดตัวมันก็เหมือนกับโทรศัพท์ - มันช่วยให้คุณโฮสต์หลาย ๆ เว็บไซต์ที่อยู่ IP เดียวกัน (และพอร์ต TCP) ตัวอย่างเช่นเซิร์ฟเวอร์การพัฒนาของเราโฮสต์เว็บไซต์แยกต่างหากหลายร้อยรายการในเวลาเดียวกันและโซลูชันเว็บโฮสติ้งมากมายใช้วิธีการเดียวกัน ("ลงทะเบียนโดเมนชี้ไปที่ที่อยู่ IP ของเราเราจะจัดการส่วนที่เหลือ") .
Luaan

21

ด้วยโปรโตคอล HTTP 1.1 (เวอร์ชัน HTTP 1.0 ก่อนหน้านี้ล้าสมัยไประยะหนึ่งแล้วดังนั้นจึงไม่น่าจะถูกใช้โดยเบราว์เซอร์เวอร์ชันล่าสุดใด ๆ ) จึงมีการhostแนะนำส่วนหัว สำหรับHTTP 1.1 ที่เป็นสายหัวจำเป็นที่จะต้องออกโดยเบราว์เซอร์ Host: example.comชื่อโดเมนจะถูกรวมไว้โดยเบราว์เซอร์ในสายนั้นเช่น ดังนั้นเว็บเซิร์ฟเวอร์จึงรู้ว่าเว็บไซต์ใดที่เบราว์เซอร์ต้องการเข้าถึงจากบรรทัดนั้น เนื่องจากเว็บเซิร์ฟเวอร์อาจรองรับเว็บไซต์หลายสิบแห่งบรรทัดดังกล่าวมีความสำคัญต่อเว็บไซต์ดังกล่าวเพื่อพิจารณาว่าเว็บไซต์ใดที่มีหน้าที่ร้องขออยู่ หากว่าเบราว์เซอร์ต้องการเข้าถึงโฮมเพจของไซต์บน example.com โดยจะออกบรรทัดต่อไปนี้ไปยังเซิร์ฟเวอร์เมื่อเชื่อมต่อกับเซิร์ฟเวอร์:

GET / HTTP/1.1

บรรทัดนั้นระบุว่าเบราว์เซอร์ต้องการรับเอกสารรูทเช่น "/" สำหรับเว็บไซต์ หากคุณต้องการที่จะเข้าถึง/somedir/testpage.html, GET /somedir/testpage.htmlจะอยู่ใน "รับ" บรรทัด บรรทัดจะตามด้วยบรรทัดด้านล่าง:

Host: example.com

ดังนั้นหากเว็บเซิร์ฟเวอร์รองรับเว็บไซต์ example.com, someothersite.com, yetanothersite.org เป็นต้นก็รู้ดีว่าควรส่งคืนหน้าหลักสำหรับ example.com หากไม่ได้รับบรรทัดนั้นหรือไม่มีชื่อโดเมนอยู่ในรายการHostก็ไม่ทราบว่าควรส่งคืนหน้าแรกของเว็บไซต์ใด ดังนั้นจึงอาจส่งคืนข้อความแสดงข้อผิดพลาดแทนหรือส่งคืนโฮมเพจสำหรับไซต์ "เริ่มต้น" สำหรับเซิร์ฟเวอร์

คุณสามารถใช้คำสั่งเดียวกันกับปัญหาเบราว์เซอร์โดยใช้โปรโตคอลtelnetเช่นtelnet example.com 80จาก Linux shell prompt หรือหน้าต่างApple OS X Terminalเพื่อเชื่อมต่อกับพอร์ต HTTP เริ่มต้นพอร์ต 80 - ดูการทดสอบการเข้าถึงเว็บไซต์โดยใช้ PuTTYสำหรับขั้นตอน ทำเช่นนั้นกับ PuTTY บนระบบ Windows


3
เพียงบันทึก: ส่วนหัวของโฮสต์ยังถูกใช้ใน HTTP 1.0 มันก็ไม่ได้ถูกต้อง HTTP 1.1 ทำให้ฟิลด์บังคับ ในทางปฏิบัติเซิร์ฟเวอร์ HTTP 1.0 จำนวนมากไม่สามารถใช้งานได้หากเบราว์เซอร์ไม่ส่งส่วนหัวของโฮสต์ (ด้วยเหตุผลทั้งหมดที่กล่าวถึงข้างต้น) ดังนั้นเบราว์เซอร์ส่วนใหญ่จึงส่งไป
Luaan

6

นี่คือสาเหตุที่Host:ส่วนหัว HTTP สิ่งนี้มีประโยชน์มากสำหรับการโฮสต์หลายไซต์บนที่อยู่ IP เดียวกัน ตัวอย่างเช่นhttp://www.k7dxs.net/และhttp://www.philipgrimes.com/มีทั้งที่อยู่ IP เดียวกัน อย่างไรก็ตามเนื่องจากHost:ส่วนหัวพวกเขาสามารถแสดงสองไซต์ที่แตกต่างกัน

สำหรับ HTTPS ตามที่ @Toothbrush ชี้ให้เห็นพวกเขาใช้การระบุชื่อเซิร์ฟเวอร์ TLS เนื่องจากส่วนหัวโฮสต์เป็นส่วนหนึ่งของคำขอเข้ารหัสและเซิร์ฟเวอร์ไม่ทราบว่าใบรับรองใดที่จะนำเสนอหากไม่มีสิ่งนี้

การทดลองที่สนุก: รับข้อมูลการงัดแงะสำหรับ Firefox (ฉันไม่สามารถหาเทียบเท่ากับ Chrome) และเริ่มยุ่งเกี่ยว เปิดhttp://slipstation.com/และแก้ไขHost:ส่วนหัวในคำขอที่จะhttp://www.zombo.com/ คุณจะเห็นเว็บไซต์ที่คุ้นเคยซึ่งอาจเป็นไปได้


จริงๆแล้วเว็บไซต์เหล่านั้นใช้ชื่อเซิร์ฟเวอร์บ่งชี้ ไม่มีวิธีบอกไซต์ที่จะแสดงถ้าทั้งสองไซต์โฮสต์บนเซิร์ฟเวอร์เดียวกันผ่าน HTTPS โดยไม่มี SNI เนื่องจากเซิร์ฟเวอร์ไม่ทราบว่าจะใช้ใบรับรองใด
แปรงสีฟัน

โอ้น่าสนใจ การทดสอบของฉันจะยังใช้งานได้หรือไม่
Duncan X Simpson

ใช่หากคุณพบสองไซต์ที่โฮสต์บนที่อยู่ IP เดียวกันผ่าน HTTP
แปรงสีฟัน

แต่ไม่ใช่ HTTPS เป็นสิ่งที่ฉันถาม
Duncan X Simpson

ไม่ไม่ควรใช้ HTTPS ถ้ามีแสดงว่ามีช่องโหว่ด้านความปลอดภัยในเว็บเซิร์ฟเวอร์
แปรงสีฟัน

5

เว็บเซิร์ฟเวอร์สามารถกำหนดค่าให้ยอมรับการเชื่อมต่อกับโดเมนหรือโดเมนย่อยเฉพาะเท่านั้น มันอาจโฮสต์หลายโดเมน

สิ่งที่เว็บเซิร์ฟเวอร์ทำเมื่อใช้ที่อยู่ IP โดยตรงนั้นสามารถกำหนดค่าได้ ในกรณีของ Apache โดยค่าเริ่มต้นจะไปที่ vhost ชื่อแรกจากไซต์ที่เปิดใช้งานซึ่งเรียงลำดับตามตัวอักษรตัวเลข

นี่เป็นส่วนที่เกี่ยวข้องมากที่สุดของเอกสาร Apache ที่ฉันพบหลังจากการค้นหาอย่างรวดเร็ว:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.