21 คะแนน โดย xguru 2022-03-07 | 3 ความคิดเห็น | แชร์ทาง WhatsApp

สรุป

  • เมื่อดึง "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 ความคิดเห็น

 
tribela 2022-03-08

ตัวอย่างเช่น หากไม่ได้อยู่หลัง Nginx หรือสิ่งอื่นที่ตั้งค่า X-Real-IP ไว้เสมอ ก็ห้ามตรวจสอบเฮดเดอร์ X-Real-IP เพราะคุณอาจกำลังอ่านค่าที่ถูก spoof มา

ส่วนนี้ดูเหมือนจะแปลคลาดเคลื่อนไปเล็กน้อย ต้นฉบับคือดังนี้

For example, you must not check the X-Real-IP header if you’re not behind Nginx or something else that always sets it, because you’ll be reading a spoofed value.

ตัวอย่างเช่น หากไม่ได้อยู่หลัง Nginx หรือไม่ได้ตั้งค่าให้มีการตั้งค่า (เฮดเดอร์นี้) ไว้เสมอ ก็ไม่ควรอ่านเฮดเดอร์ X-Real-IP เพราะจะทำให้อ่านค่าที่ถูก spoof มา

 
xguru 2022-03-08

อ๋อ เดี๋ยวจะแก้ไว้ให้ครับ ขอบคุณครับ!

 
tribela 2022-03-08

โดยทั่วไปจะใช้ตัวแปรสภาพแวดล้อม TRUSTED_PROXY เพื่อตัดพร็อกซีที่ "เชื่อถือได้" ออกจากทางขวาสุดทีละตัว แล้วใช้ IP ตัวแรกที่พบ
และก็มักจะถือว่า IP ภายใน เช่น 192.168.0.0/16 เป็นพร็อกซีที่เชื่อถือได้ด้วย