สรุป
- เมื่อดึง "Real Client IP" จากเฮดเดอร์ X-Forwarded-For ควรใช้ IP ที่อยู่ขวาสุด
- IP ที่อยู่ซ้ายสุดในเฮดเดอร์ XFF มักถูกมองว่าเป็นค่า "ใกล้กับไคลเอนต์ที่สุด" หรือ "เกือบจะจริงที่สุด" แต่สามารถปลอมแปลงได้ (spoofable) จึงไม่ควรใช้กับสิ่งใดก็ตามที่เกี่ยวข้องกับความปลอดภัย
- เมื่อต้องเลือก IP ขวาสุดจาก XFF ควรใช้อินสแตนซ์สุดท้ายของเฮดเดอร์นั้น
- ค่าประเภท "True Client IP" ที่รีเวิร์สพร็อกซีตั้งไว้ (เช่น X-Real-IP, True-Client-IP) ก็พอใช้ได้ แต่
- ขึ้นอยู่กับว่ารีเวิร์สพร็อกซีกำหนดค่านั้นอย่างไร
- และไม่แน่ว่ารีเวิร์สพร็อกซีเองอาจถูกหลอกมาแล้ว (spoofed)
- รวมถึงขึ้นอยู่กับการตั้งค่าของรีเวิร์สพร็อกซีด้วย
- เฮดเดอร์ที่รีเวิร์สพร็อกซีไม่ได้ตั้งค่าไว้เป็นพิเศษนั้นเชื่อถือไม่ได้
- ตัวอย่างเช่น หากไม่ได้อยู่หลัง Nginx หรือไม่ได้ตั้งให้กำหนดเฮดเดอร์นี้เสมอ ก็ไม่ควรอ่านเฮดเดอร์ X-Real-IP เพราะอาจกำลังอ่านค่าที่ถูกปลอมแปลงอยู่
- การติดตั้งใช้งาน rate limiter จำนวนมากใช้ IP ที่สามารถปลอมแปลงได้ จึงเสี่ยงต่อการหลบเลี่ยง rate limiting และการโจมตีทำให้หน่วยความจำหมด
- หากคุณกำลังใช้สิ่งที่เกี่ยวกับ "real client ip" ในโค้ดหรืออินฟราของคุณ ควรดูรายละเอียดเชิงเทคนิคต่อจากนี้
รายละเอียด (ยาว เลยแปลเฉพาะหัวข้อ)
- บทนำ: ทุกวันนี้การหา "real client ip" เป็นเรื่องชวนปวดหัว
- หลุมพรางต่าง ๆ
- เฮดเดอร์เชื่อถือไม่ได้
- มีหลายเฮดเดอร์
- Private IP
- IP Splitting
- ข้อมูลที่ไม่เข้ารหัสย่อมเชื่อถือไม่ได้เสมอ
- อย่าง X-Client-IP, True-Client-IP สามารถถูกปลอมแปลงได้
- ทำความเข้าใจ X-Forwarded-For
- วิธีหลีกเลี่ยงหลุมพราง
- อัลกอริทึมสำหรับหา IP จริง
- ดึงค่า IP ทั้งหมดออกมา
- เลือกว่าจะใช้ค่าไหนตามข้อกำหนดด้านความปลอดภัย
- ซ้ายสุด, ขวาสุด
- ตัวอย่างจากการใช้งานจริง
- Cloudflare, Nginx, Apache
- Akamai
- Fastly
- Azure
- go-chi/chi
- didip/tollbooth
- ulule/limiter
- sethvargo/go-limiter
- Let's Encrypt
- Express
- Traefik
- phpList
- IIS
- Tor
- ขั้นสูง: หลุมพรางเชิงทฤษฎีและวิธีโจมตี
- RFC 7239: Forwarded HTTP Extension, June 2014
3 ความคิดเห็น
ส่วนนี้ดูเหมือนจะแปลคลาดเคลื่อนไปเล็กน้อย ต้นฉบับคือดังนี้
ตัวอย่างเช่น หากไม่ได้อยู่หลัง Nginx หรือไม่ได้ตั้งค่าให้มีการตั้งค่า (เฮดเดอร์นี้) ไว้เสมอ ก็ไม่ควรอ่านเฮดเดอร์
X-Real-IPเพราะจะทำให้อ่านค่าที่ถูก spoof มาอ๋อ เดี๋ยวจะแก้ไว้ให้ครับ ขอบคุณครับ!
โดยทั่วไปจะใช้ตัวแปรสภาพแวดล้อม TRUSTED_PROXY เพื่อตัดพร็อกซีที่ "เชื่อถือได้" ออกจากทางขวาสุดทีละตัว แล้วใช้ IP ตัวแรกที่พบ
และก็มักจะถือว่า IP ภายใน เช่น 192.168.0.0/16 เป็นพร็อกซีที่เชื่อถือได้ด้วย