การเปลี่ยนเส้นทาง 302 จะรักษาสตริงอ้างอิงหรือไม่


93

ฉันต้องการเปลี่ยนเส้นทางผู้ใช้จากเพจหนึ่งไปยังอีกเพจหนึ่ง แต่ฉันต้องรักษาสตริงอ้างอิงดั้งเดิม ตัวอย่างเช่นหากพวกเขาเริ่มต้นที่http://www.othersite.com/pageA.jspให้คลิกลิงก์ที่นำไปยังhttp://www.example.com/pageB.jspจากนั้นจะเรียกใช้ 302 เปลี่ยนเส้นทางไปที่http://www.example.com/pageC.jspฉันต้องการสตริงอ้างอิงที่จะมีhttp://www.othersite.com/pageA.jsp

นี่เป็นลักษณะการทำงานปกติสำหรับการเปลี่ยนเส้นทาง 302 หรือไม่ หรือผู้อ้างอิงดั้งเดิมของฉันจะถูกทิ้งในความโปรดปรานhttp://www.example.com/pageB.jsp? อย่างนั้นคงไม่ถูกใจ

ฉันไม่รู้ว่ามันสร้างความแตกต่างหรือไม่ แต่ฉันทำงานใน JSP และฉันใช้response.sendRedirect()เพื่อดำเนินการเปลี่ยนเส้นทาง 302

ฉันควรพูดถึงว่าฉันได้ทำการทดลองกับสิ่งนี้และดูเหมือนว่าจะเก็บสตริงอ้างอิงดั้งเดิมไว้ ( http://www.othersite.com/pageA.jsp) แต่ฉันแค่อยากให้แน่ใจว่านี่เป็นพฤติกรรมเริ่มต้นตามปกติและไม่ใช่เรื่องแปลกในตอนท้ายของฉัน


แม้ว่าฉันกำลังใช้การเปลี่ยนเส้นทาง 302 แต่ฉันอาจใช้การเปลี่ยนเส้นทาง 301 แทน คุณทราบหรือไม่ว่าพฤติกรรมสำหรับการเปลี่ยนเส้นทาง 301 น่าเชื่อถือกว่านี้หรือไม่?


3
ฉันแค่ต้องการสิ่งที่ตรงกันข้าม ทำเปลี่ยนเส้นทางฝั่งเซิร์ฟเวอร์เปลี่ยนอ้างอิงในการเปลี่ยนเส้นทาง (เพื่อลบอ้างอิงเดิม) ทุกคน?
cprcrack

คำตอบ:


33

คำตอบสั้น ๆ ไม่ได้ระบุไว้ใน RFC 2616 http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.36สำหรับส่วนหัวของผู้อ้างอิงหรือรหัสสถานะ 302

ทางออกที่ดีที่สุดของคุณคือทำการทดสอบกับเบราว์เซอร์หลายตัวและดูว่ามีพฤติกรรมที่สอดคล้องกันหรือไม่

สำหรับเข็มขัดแบบเต็มและวงเล็บปีกกาให้เข้ารหัสผู้อ้างอิงดั้งเดิมใน URL การเปลี่ยนเส้นทางเพื่อให้คุณสามารถรับประกันได้ว่าจะได้รับ


19
ผู้ที่อาจสนใจฉันได้ทำการทดสอบ spme บนเบราว์เซอร์หลัก: stackoverflow.com/questions/2158283/…
Marco Demaio

121

ฉันไม่รู้เกี่ยวกับ 302 แต่ฉันทดสอบ 301 ในเบราว์เซอร์บางตัวในวันนี้ผลลัพธ์:

SCENARIO : ผู้ใช้คลิกลิงก์บน domainX ที่ชี้ไปที่โดเมน domainA ทำการเปลี่ยนเส้นทาง 301 ไปยัง domainB

  • IE8 refererเมื่อเชื่อมโยงไปถึง domainB คือ: domainX (แม้ว่าจะใช้การเรียกดูแบบ InPrivate และแม้ว่าผู้ใช้จะเปิดลิงก์ในแท็บใหม่ก็ตาม)
  • Safari4 refererเมื่อเชื่อมโยงไปถึง domainB คือ: domainX (แม้ว่าผู้ใช้จะเปิดลิงก์ในแท็บใหม่)
  • FF3.6.10 refererเมื่อเชื่อมโยงไปถึง domainB คือ: domainX (แม้ว่าผู้ใช้จะเปิดลิงก์ในแท็บใหม่)
  • Chrome5 refererเมื่อเชื่อมโยงไปถึงโดเมน B คือ: domainX ( เว้นแต่ผู้ใช้จะเปิดลิงก์ในแท็บใหม่)
  • Chrome26 refererเมื่อเชื่อมโยงไปถึงโดเมน B คือ: domainX (แม้ว่าผู้ใช้จะเปิดลิงก์ในแท็บใหม่)

27
หมายเหตุ: การทดสอบนี้ได้ดำเนินการมาก่อนหน้านี้แล้วและในปัจจุบัน Chrome 26 จะทำงานในลักษณะเดียวกันแม้ว่าจะเปิดในแท็บใหม่ก็ตาม
Benjamin

ไม่ได้ทดสอบกับเบราว์เซอร์ทั้งหมด แต่พฤติกรรมของ 302 ดูเหมือนจะเหมือนกัน
Amir Ali Akbari

1
หมายเหตุ: หากเพจเปลี่ยนเส้นทาง (domainA) ออกReferrer-Policy: no-Referrer header Chrome (และ Opera) จะไม่ตั้งค่าReferer header ในคำขอไปยังเพจปลายทาง (domainB) Firefox และ Edge ยังคงส่ง
David Balažic

12

คำถามที่ดี. ในกรณีนี้การส่งผู้อ้างอิงจะขึ้นอยู่กับเบราว์เซอร์ทั้งหมด (เนื่องจากเบราว์เซอร์ได้รับแจ้งให้ส่งคำขออื่นไปยังแหล่งข้อมูลใหม่)

RFC 2616ยังคงเงียบเกี่ยวกับปัญหา:

ทรัพยากรที่ร้องขออยู่ชั่วคราวภายใต้ URI อื่น เนื่องจากการเปลี่ยนเส้นทางอาจมีการเปลี่ยนแปลงในบางครั้งไคลเอ็นต์จึงควรใช้ Request-URI ต่อไปสำหรับคำขอในอนาคต การตอบกลับนี้สามารถใช้แคชได้หากระบุโดยฟิลด์ส่วนหัว Cache-Control หรือ Expires

ฉันไม่ไว้ใจให้เบราว์เซอร์ส่งผู้อ้างอิงที่ถูกต้องไปด้วย ฉันพนันได้เลยว่ามีอย่างน้อยหนึ่งอย่างที่ส่งสิ่งที่แตกต่างจากคนอื่น ๆ

วิธีแก้ปัญหา

หากทำได้ทำไมไม่เพิ่ม?override_referer=<old_url>พารามิเตอร์ให้กับ URL ที่คุณเปลี่ยนเส้นทางไปและแยกวิเคราะห์ค่านั้นแทน HTTP_REFERER

ด้วยวิธีนี้คุณจะมั่นใจได้ว่าจะได้ผลลัพธ์ที่ถูกต้องเสมอและคุณจะไม่สูญเสียอะไรในด้านความปลอดภัย: ผู้อ้างอิงสามารถถูกแกล้งได้ไม่ว่าจะด้วยวิธีใด


4
คุณกำลังสูญเสียบางอย่างในด้านความปลอดภัยโดยการทำให้ผู้อ้างอิงสามารถลบล้างได้ใน URL ในเบราว์เซอร์สมัยใหม่ส่วนใหญ่ผู้อ้างอิงสำหรับคำขอ AJAX จะไม่สามารถเปลี่ยนแปลงผ่าน JavaScript ได้ อย่างไรก็ตาม URL สามารถทำได้อย่างชัดเจน ซึ่งหมายความว่าในกรณีของการโจมตี XSS ผู้อ้างอิงมีความน่าเชื่อถือมากกว่าพารามิเตอร์ URL อย่าเข้าใจฉันผิดผู้อ้างอิงยังคงเป็นข้อมูลของผู้ใช้อย่างชัดเจนซึ่งไม่สามารถเชื่อถือได้อย่างสมบูรณ์ แต่การปลอมแปลงข้อมูลนั้นให้คนอื่นทำได้ยากกว่าการเปลี่ยน URL
ไฟแล

7

ฉันมีปัญหาเกี่ยวกับ oposite: ฉันต้องการให้ผู้อ้างอิงคือ "pageB" แต่ไม่มีขั้นตอนของเบราว์เซอร์ที่รักษาด้วยวิธีนี้ ...

ดังนั้นฉันจึงลองใช้การเปลี่ยนเส้นทาง HTML บน pageB (แทนการเปลี่ยนเส้นทาง 301 หรือ 302):

<meta http-equiv="refresh" content="0; url=pageC.jsp" />

และผลลัพธ์ก็น่าประหลาดใจ:

  • Referer คือ pageB พร้อม Chrome
  • ผู้อ้างอิงไม่ว่างด้วย FireFox & IE!

หวังว่านี่จะช่วยได้

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