เชื่อถือ $ _SERVER ['REMOTE_ADDR'] ได้หรือไม่


89

เชื่อถือได้ปลอดภัย$_SERVER['REMOTE_ADDR']หรือไม่? สามารถทดแทนได้โดยการเปลี่ยนส่วนหัวของคำขอหรืออะไรทำนองนั้น?

มันปลอดภัยไหมที่จะเขียนอะไรแบบนั้น?

if ($_SERVER['REMOTE_ADDR'] == '222.222.222.222') { // my ip address
    $grant_all_admin_rights = true;
}

3
การเพิ่มคำตอบที่มีอยู่จะเป็นที่อยู่ IP ที่ส่งคำขอไปยังเซิร์ฟเวอร์ของคุณเสมอ แต่ไม่ได้หมายความว่าเป็นที่อยู่ IP ของคอมพิวเตอร์ที่เริ่มต้นคำขอ พร็อกซีเซิร์ฟเวอร์จำนวนเท่าใดก็ได้ที่อยู่ระหว่างคุณกับผู้ใช้ปลายทางและเซิร์ฟเวอร์ที่ใกล้คุณที่สุดคือที่อยู่ IP ที่คุณได้รับ
Dan Grossman

ใช่มันปลอดภัยเพราะไม่สามารถบรรยายได้ด้วยเทคนิคอื่นหรือการโกงบางอย่าง แต่ตรวจสอบให้แน่ใจว่าคุณได้เพิ่มการตรวจสอบสำหรับตัวแปร $ Grant_all_admin_rights
ยุดาปวีรา

ตัวแปร $ _SERVER สามารถปลอมแปลงได้เช่น curl_setopt ($ ch, CURLOPT_HTTPHEADER, array ("REMOTE_ADDR: $ ip", "HTTP_X_FORWARDED_FOR: $ ip")); ดังนั้นจึงขึ้นอยู่กับบริบททั้งหมด: หากผู้โจมตีคาดหวังการตอบสนองมันจะกลับไปที่ $ ip หากพวกเขาไม่สนใจเกี่ยวกับการตอบสนองพวกเขาสามารถหลอกลวงส่วนหัวได้อย่างแน่นอน หากรหัสของคุณหลังจากการตรวจสอบส่วนหัวแทนที่จะกล่าวว่า: "open_the_door_to_badguys ();" คุณจะมีปัญหา
TMG

3
@TMG คุณไม่สามารถปลอมแปลง$_SERVER['REMOTE_ADDR']ตัวแปรโดยตั้งค่าส่วนหัวคำขอ HTTP PHP นำหน้าส่วนหัวคำขอ HTTP ทั้งหมดโดยอัตโนมัติHTTP_เมื่อสร้างคีย์ใน$_SERVERsuperglobal
MrWhite

คำตอบ:


110

ใช่มันปลอดภัย เป็น IP ต้นทางของการเชื่อมต่อ TCP และไม่สามารถทดแทนได้ด้วยการเปลี่ยนส่วนหัว HTTP

กรณีหนึ่งที่คุณอาจต้องกังวลคือหากคุณอยู่เบื้องหลังพร็อกซีย้อนกลับซึ่งในกรณีนี้ REMOTE_ADDR จะเป็น IP ของพร็อกซีเซิร์ฟเวอร์เสมอและ IP ของผู้ใช้จะอยู่ในส่วนหัว HTTP (เช่นX-Forwarded-For ). แต่สำหรับกรณีการใช้งานปกติการอ่าน REMOTE_ADDR นั้นใช้ได้


4
แล้วการปลอมแปลงที่อยู่ IP ล่ะ?
อับดุล

1
@Abdull คนที่ทำได้มักจะเป็นคนเดียวกับที่เข้าถึงกล่องของคุณได้ ดังนั้นอย่ากังวลกับเรื่องนี้มากนัก
Behrooz

5
@Abdull การปลอมแปลง IP สามารถส่งข้อความได้ทางเดียวเท่านั้นคุณไม่สามารถปลอมแปลง IP ของคุณและได้รับข้อความตอบแทน

1
เราเตอร์อินเทอร์เน็ตไม่ตรวจสอบ IP ต้นทางและปลายทางเพื่อกำหนดเส้นทางแพ็กเก็ตใช่หรือไม่ ฉันสงสัยว่าแพ็กเก็ตที่ปลอมแปลงจะไปถึงปลายทางผ่านโหนดอินเทอร์เน็ต
Viktor Joras

57

$_SERVER['REMOTE_ADDR']คือที่อยู่ IP ที่การเชื่อมต่อ TCP เข้ามา แม้ว่าในทางเทคนิคจะเป็นไปได้ที่จะปลอมแปลงที่อยู่ IP แบบสองทิศทางบนอินเทอร์เน็ต (โดยการประกาศเส้นทางที่ไม่เหมาะสมผ่าน BGP) การโจมตีดังกล่าวมีแนวโน้มที่จะพบเห็นและไม่สามารถใช้ได้กับผู้โจมตีทั่วไป - โดยพื้นฐานแล้วผู้โจมตีของคุณต้องมีอำนาจควบคุม ISP หรือผู้ให้บริการ ไม่มีการโจมตีด้วยการปลอมแปลงแบบทิศทางเดียวที่เป็นไปได้กับ TCP (ยัง) การปลอมแปลง IP แบบสองทิศทางเป็นเรื่องเล็กน้อยบน LAN

โปรดทราบว่าอาจไม่ใช่ IPv4 แต่เป็นที่อยู่ IPv6 ตรวจสอบปัจจุบันของคุณจะดีในเรื่องที่ แต่ถ้าคุณจะตรวจสอบว่า1.2.3.4เกิดขึ้นที่ใดก็ได้ภายในผู้โจมตีก็สามารถเชื่อมต่อจาก$_SERVER['REMOTE_ADDR']2001:1234:5678::1.2.3.4

สรุปแล้วสำหรับสิ่งอื่นนอกเหนือจากแอปพลิเคชันที่สำคัญ (การธนาคาร / การทหาร / ความเสียหายที่อาจเกิดขึ้น> 50.000 €) คุณสามารถใช้ที่อยู่ IP ระยะไกลได้หากคุณสามารถยกเว้นผู้โจมตีในเครือข่ายท้องถิ่นของคุณได้


4
คุณรับทราบข้อมูลเกี่ยวกับ Internet Protocol มาก
Brian Peterson

@phihag ที่$_SERVER['REMOTE_ADDR']อยู่ IP ที่การเชื่อมต่อ TCP เข้ามานั้นขึ้นอยู่กับ SAPI ของคุณหรือไม่
Pacerier

มันยังห่างไกลจากความไม่สะดวกสำหรับผู้โจมตีบน WEP / WPA WLAN เพื่อไล่ไคลเอ็นต์ตัวจริงออกและปลอมแปลงที่อยู่ IP นั้น - ทั้ง WEP และ WPA มีจุดอ่อนที่ทำให้การปลอมแปลงyou have been kicked off the wlanแพ็กเก็ตง่ายต่อการสร้างด้วยเครื่องมือที่เหมาะสม google WPA downgrade testเช่น
hanshenrik

ที่อยู่ IP คือระดับ IP ไม่ใช่ระดับ TCP
Viktor Joras

3

ดังที่กล่าวมาแล้วว่าไม่ปลอดภัยอย่างแน่นอน แต่ไม่ได้หมายความว่าคุณไม่ควรใช้ ลองรวมสิ่งนี้กับวิธีการตรวจสอบสิทธิ์อื่น ๆ เช่นการตรวจสอบค่า COOKIE


7
หลังจากปลอมแปลงที่อยู่ IP การเปลี่ยนคำขอ http และการส่งคุกกี้ปลอมเป็นเค้ก ..... (หรือคุกกี้ชิ้นหนึ่ง)
Uri Goren

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