วิธีเดียวที่ปลอดภัยในการทำเช่นนี้
คำตอบอื่น ๆ ทั้งหมดในหน้านี้มีผลกระทบด้านความปลอดภัยที่คุณต้องระวัง
วิธีการรับประกันความปลอดภัยเพียงอย่างเดียวในการดึงข้อมูลโดเมนปัจจุบัน
คือ𝓼𝓽𝓸𝓻𝓮𝓲𝓽𝓲𝓷𝓪𝓼𝓮𝓬𝓾𝓻𝓮𝓵𝓸𝓬𝓪𝓽𝓲𝓸𝓷𝔂𝓸𝓾𝓻𝓼𝓮𝓵𝓯
เฟรมเวิร์กส่วนใหญ่ดูแลการจัดเก็บโดเมนให้คุณดังนั้นคุณจะต้องการศึกษาเอกสารประกอบสำหรับเฟรมเวิร์กเฉพาะ หากคุณไม่ได้ใช้เฟรมเวิร์กให้พิจารณาจัดเก็บโดเมนในที่ต่อไปนี้:
+ ------------------------------------------------- --- + ----------------------------------- +
| วิธีการที่ปลอดภัยในการจัดเก็บโดเมน | ใช้โดย |
+ ------------------------------------------------- --- + ----------------------------------- +
| ไฟล์ปรับแต่ง | Joomla, Drupal / Symfony |
| ฐานข้อมูล | WordPress |
| ตัวแปรด้านสิ่งแวดล้อม Laravel
| รีจิสทรีบริการ | Kubernetes DNS |
+ ------------------------------------------------- --- + ----------------------------------- +
คุณสามารถใช้สิ่งต่อไปนี้ ... แต่มันไม่ปลอดภัย
แฮกเกอร์สามารถทำให้ตัวแปรเหล่านี้แสดงผลได้ตามต้องการ สิ่งนี้สามารถนำไปสู่การวางยาพิษแคชและการโจมตีฟิชชิงที่แทบจะสังเกตไม่เห็น
$_SERVER['HTTP_HOST']
นี้ได้รับโดเมนจากส่วนหัวของคำขอที่มีการเปิดให้จัดการโดยแฮกเกอร์ เหมือนกับ:
$_SERVER['SERVER_NAME']
สิ่งนี้สามารถทำได้ดีกว่าหากการตั้งค่า Apache usecanonicalnameถูกปิด ในกรณีนี้$_SERVER['SERVER_NAME']
จะไม่ได้รับอนุญาตให้เติมด้วยค่าที่กำหนดเองอีกต่อไปและจะปลอดภัย นี่คืออย่างไรก็ตามไม่ใช่ค่าเริ่มต้นและไม่ปกติของการตั้งค่า
ในระบบยอดนิยม
ด้านล่างเป็นวิธีที่คุณสามารถรับโดเมนปัจจุบันในกรอบ / ระบบต่อไปนี้:
WordPress
$urlparts = parse_url(home_url());
$domain = $urlparts['host'];
หากคุณกำลังสร้าง URL ใน WordPress เพียงใช้home_urlหรือsite_urlหรือใด ๆ ของฟังก์ชั่น URL อื่น
Laravel
request()->getHost()
request()->getHost
ฟังก์ชั่นจะรับมาจาก Symfony และได้รับการรักษาความปลอดภัยตั้งแต่ 2013 CVE-2013-4752ปะ
Drupal
ตัวติดตั้งยังไม่ได้ทำการรักษาความปลอดภัย ( ปัญหา # 2404259 ) แต่ใน Drupal 8 มีเอกสารคุณสามารถติดตามการตั้งค่าโฮสต์ที่เชื่อถือได้เพื่อความปลอดภัยในการติดตั้ง Drupal หลังจากนั้นคุณสามารถใช้สิ่งต่อไปนี้:
\Drupal::request()->getHost();
กรอบอื่น ๆ
โปรดแก้ไขคำตอบนี้เพื่อรวมวิธีรับโดเมนปัจจุบันในกรอบงานที่คุณชื่นชอบ เมื่อทำเช่นนั้นโปรดรวมลิงก์ไปยังซอร์สโค้ดที่เกี่ยวข้องหรือสิ่งอื่นใดที่จะช่วยให้ฉันตรวจสอบว่าเฟรมเวิร์กกำลังทำสิ่งต่าง ๆ อย่างปลอดภัย
ภาคผนวก
ตัวอย่างการหาประโยชน์:
การวางยาพิษของแคชอาจเกิดขึ้นได้หากบอตเน็ตร้องขอหน้าอย่างต่อเนื่องโดยใช้ส่วนหัวโฮสต์ที่ไม่ถูกต้อง HTML ที่เป็นผลลัพธ์จะมีลิงก์ไปยังเว็บไซต์ของผู้โจมตีที่สามารถหลอกลวงผู้ใช้ของคุณได้ ในตอนแรกลิงก์ที่เป็นอันตรายจะถูกส่งกลับไปที่แฮ็กเกอร์เท่านั้น แต่หากแฮกเกอร์ทำการร้องขอได้เพียงพอหน้าเวอร์ชันที่เป็นอันตรายจะสิ้นสุดลงในแคชของคุณซึ่งจะถูกส่งไปยังผู้ใช้รายอื่น
การโจมตีแบบฟิชชิงอาจเกิดขึ้นได้หากคุณจัดเก็บลิงก์ในฐานข้อมูลตามส่วนหัวของโฮสต์ ตัวอย่างเช่นสมมติว่าคุณเก็บ URL ที่แน่นอนไปยังโปรไฟล์ของผู้ใช้ในฟอรัม ด้วยการใช้ส่วนหัวที่ไม่ถูกต้องแฮ็กเกอร์อาจทำให้ใครก็ตามที่คลิกลิงก์โปรไฟล์ของตนถูกส่งไปยังไซต์ฟิชชิ่ง
พิษการรีเซ็ตรหัสผ่านอาจเกิดขึ้นได้หากแฮ็กเกอร์ใช้ส่วนหัวโฮสต์ที่เป็นอันตรายเมื่อกรอกแบบฟอร์มรีเซ็ตรหัสผ่านสำหรับผู้ใช้รายอื่น จากนั้นผู้ใช้นั้นจะได้รับอีเมลที่มีลิงค์รีเซ็ตรหัสผ่านซึ่งนำไปสู่ไซต์ฟิชชิ่ง
นี่คือตัวอย่างที่เป็นอันตรายเพิ่มเติม
คำเตือนและหมายเหตุเพิ่มเติม:
- เมื่อusecanonicalnameถูกปิดการใช้งาน
$_SERVER['SERVER_NAME']
จะถูกเติมด้วยส่วนหัวเดียวกัน$_SERVER['HTTP_HOST']
จะใช้ anyways (รวมถึงพอร์ต) นี่คือการตั้งค่าเริ่มต้นของ Apache หากคุณหรือ devops เปิดใช้งานสิ่งนี้คุณก็ไม่เป็นไร - แต่คุณต้องการที่จะพึ่งพาทีมที่แยกจากกันหรืออนาคตของคุณเองสามปีในอนาคต ค่าเริ่มต้น? แม้ว่าสิ่งนี้จะทำให้สิ่งต่าง ๆ มีความปลอดภัย แต่ฉันก็จะไม่ไว้ใจการตั้งค่านี้
- อย่างไรก็ตาม Redhat จะเปิดใช้งานตามปกติเป็นค่าเริ่มต้น [ แหล่งที่มา ]
- หากserverAliasถูกใช้ในรายการโฮสต์เสมือนและขอชื่อแทนโดเมน
$_SERVER['SERVER_NAME']
จะไม่ส่งคืนโดเมนปัจจุบัน แต่จะส่งคืนค่าของคำสั่ง serverName
- หาก serverName ไม่สามารถได้รับการแก้ไขคำสั่งชื่อโฮสต์ของระบบปฏิบัติการที่ใช้ในสถานที่[แหล่ง]
- ถ้าส่วนหัวของโฮสต์ที่เหลือออกจากเซิร์ฟเวอร์จะประพฤติตัวเป็นถ้า usecanonical อยู่บน[แหล่ง]
- ท้ายสุดฉันเพิ่งลองใช้ประโยชน์จากเซิร์ฟเวอร์ท้องถิ่นของฉันและไม่สามารถหลอกส่วนหัวของโฮสต์ได้ ฉันไม่แน่ใจว่ามีการอัปเดตของ Apache ที่แก้ไขปัญหานี้หรือไม่หรือกำลังทำสิ่งผิดปกติ ส่วนหัวนี้จะยังคงใช้ประโยชน์ได้ในสภาพแวดล้อมที่ไม่ได้ใช้โฮสต์เสมือน
คุยโวเล็กน้อย:
คำถามนี้ได้รับมุมมองนับแสนโดยไม่ต้องพูดถึงปัญหาด้านความปลอดภัยที่เดียว! ไม่ควรเป็นแบบนี้ แต่เพียงเพราะคำตอบของ Stack Overflow เป็นที่นิยมนั่นไม่ได้หมายความว่าปลอดภัย