หากใช้ซอฟต์แวร์พร็อกซีย้อนกลับเมื่อย้อนกลับพร็อกซ์ URL ของ http://192.168.1.110:2046/ ไปยัง URL ของ http://www.xxx.com/ ให้ใช้วิธีการร้องขอ ที่อยู่ที่ได้รับโดยใช้วิธีการ request.getRemoteaddr () คือ: 127.0.0.1 หรือ 192.168.1.110 ไม่ใช่ IP จริงของไคลเอนต์
หลังจากผ่านพร็อกซีเนื่องจากมีการเพิ่มเลเยอร์กลางระหว่างไคลเอนต์และบริการเซิร์ฟเวอร์ไม่สามารถรับ IP ของไคลเอนต์ได้โดยตรงและแอปพลิเคชันฝั่งเซิร์ฟเวอร์ไม่สามารถกลับไปที่ไคลเอนต์ได้โดยตรงผ่านที่อยู่การส่งต่อ อย่างไรก็ตามในข้อมูลส่วนหัว HTTP ของการส่งต่อคำขอจะเพิ่มข้อมูล X-Forwarded-for ใช้เพื่อติดตามที่อยู่ IP ของไคลเอนต์ดั้งเดิมและที่อยู่เซิร์ฟเวอร์ที่ร้องขอโดยไคลเอนต์ดั้งเดิม เมื่อเราเข้าถึง http://www.xxx.com/index.jsp/ มันไม่ใช่เบราว์เซอร์ของเราที่เข้าถึงไฟล์ index.jsp บนเซิร์ฟเวอร์จริง ๆ แต่พร็อกซีเซิร์ฟเวอร์เข้าถึง http: //192.168 เป็นครั้งแรก 2046/index.jsp, พร็อกซีเซิร์ฟเวอร์ส่งคืนผลลัพธ์การเข้าถึงไปยังเบราว์เซอร์ของเรา พร็อกซีเซิร์ฟเวอร์ไม่ใช่ที่อยู่ IP ของไคลเอนต์
จากนั้นวิธีการรับที่อยู่ IP จริงของไคลเอนต์สามารถรับได้:
การคัดลอกรหัสมีดังนี้:
สตริงสาธารณะ getRemortip (คำขอ httpservletrequest) {
if (request.getheader ("x-forwarded-for") == null) {
return request.getRemoteaddr ();
-
return request.getheader ("x-forwarded-for");
-
แต่เมื่อฉันเยี่ยมชม http://www.xxx.com/index.jsp/ ที่อยู่ IP ที่ส่งคืนจะไม่เป็นที่รู้จักเสมอไม่ใช่ 127.0.0.1 หรือ 192.168.1.110 ดังที่แสดงด้านบนและฉันเยี่ยมชม http: // เมื่อ /192.168 1.110: 2046/index.jsp ที่อยู่ IP จริงของลูกค้าสามารถส่งคืนได้และวิธีการเขียนเพื่อตรวจสอบ เหตุผลอยู่ในปลาหมึก รายการ forwarded_for ในไฟล์การกำหนดค่า squid.conf forwarded_for จะเริ่มต้นเป็น ON
ดังนั้นวิธีที่สองในการรับที่อยู่ IP จริงของลูกค้าสามารถรับได้:
การคัดลอกรหัสมีดังนี้:
Public String getIpaddr (คำขอ httpservletrequest) {
string ip = request.getheader ("x-forwarded-for");
if (ip == null || ip.length () == 0 || "ไม่ทราบ" .equalsignorecase (ip)) {
ip = request.getheader ("proxy-client-ip");
-
if (ip == null || ip.length () == 0 || "ไม่ทราบ" .equalsignorecase (ip)) {
ip = request.getheader ("wl-proxy-client-ip");
-
if (ip == null || ip.length () == 0 || "ไม่ทราบ" .equalsignorecase (ip)) {
ip = request.getRemoteaddr ();
-
ส่งคืน IP;
-
อย่างไรก็ตามหากมีการส่งพร็อกซีย้อนกลับหลายระดับมีมากกว่าหนึ่งค่าของ X-Forwarded-for แต่สตริงของค่า IP
คำตอบคือการใช้สตริง IP ที่ไม่ถูกต้องที่ไม่ได้ใช้ครั้งแรกใน X-Forwarded-for
ชอบ:
การคัดลอกรหัสมีดังนี้:
X-Forwarded-for: 192.168.1.110, 192.168.1.120, 192.168.1.130, 192.168.1.100
IP จริงของผู้ใช้คือ: 192.168.1.110