ฉันสามารถตั้งค่าลิงก์จากหน้า HTTPS ไปยังหน้า HTTP ในโดเมนอื่นและยังคงผ่าน URL ของหน้าแรกเป็นผู้อ้างอิงโดยใช้เทคนิคต่อไปนี้
คำนิยาม
หน้าต้นทาง : หน้า HTTPS ที่มีลิงก์ไปยังหน้าปลายทางที่โฮสต์ HTTP ในตัวอย่างนี้:https://example1.com/origin.html
หน้าปลายทาง : หน้า HTTP ที่มีสิทธิ์เข้าถึงผู้อ้างอิงของหน้าต้นทาง ในตัวอย่างนี้:http://example2.com/destination.html
แผนพื้นฐาน
สิ่งนี้มีผลในการทำให้การเปลี่ยนเส้นทางมาจากเวอร์ชัน HTTP ของหน้าต้นทาง:
ลิงก์ในหน้าต้นทาง HTTPS เชื่อมโยงไปยังหน้าปัจจุบัน แต่เพิ่มพารามิเตอร์การสืบค้นสำหรับหน้าปลายทาง [1] เช่น:https://example1.com/origin.html?goto=http://example2.com/destination.html
เมื่อลิงก์ถูกคลิกเซิร์ฟเวอร์ที่ example1.com ขัดจังหวะคำขอมาตรฐานเมื่อมีพารามิเตอร์การค้นหา 'goto' จากนั้น:
- เก็บพารามิเตอร์ 'goto' ในคุกกี้ 'goto'
- ลบพารามิเตอร์และค่า 'goto' ออกจาก URL ของคำขอปัจจุบัน
- 302 เปลี่ยนเส้นทางไปยัง URL ที่ล้างใหม่นี้ในเวอร์ชัน HTTP ของโดเมนต้นทางเช่น
http://example1.com/origin.html
เซิร์ฟเวอร์จะตรวจสอบการร้องขอคุกกี้ 'goto' ทุกครั้งและหากมีอยู่จะล้างคุกกี้และแสดงหน้าการเปลี่ยนเส้นทางที่ง่ายมาก หน้านี้มี [2]:
- หน้าต่าง Javascript window.location.replace () สคริปต์ที่เปลี่ยนเส้นทางไปยัง URL คุกกี้ goto
- แท็ก Meta Refresh ที่มีค่าของ URL คุกกี้ goto และการหน่วงเวลาไม่กี่วินาที
- ลิงก์ไปยัง URL คุกกี้ของ goto
หมายเหตุ
[1] โซลูชันพื้นฐานนี้เป็นตัวเปลี่ยนเส้นทางแบบเปิดและควรพิจารณาบางอย่างเพื่อป้องกันผู้ร้ายโดยใช้พารามิเตอร์การค้นหา goto เพื่อเปลี่ยนเส้นทาง UAs ในการโจมตีแบบฟิชชิง
[2] บางเบราว์เซอร์จะไม่ส่งผู้อ้างอิงเมื่อเปลี่ยนเส้นทางผ่านการเปลี่ยนเส้นทาง JS หรือเมตาแท็กรีเฟรช ในการทดสอบของฉัน IE8 และต่ำกว่าไม่ผ่านผู้อ้างอิง
ฉันไม่แน่ใจว่าเทคนิคนี้จะอนุญาตให้โปรแกรมรวบรวมข้อมูลของเครื่องมือค้นหาติดตามลิงก์หรือไม่ สิ่งนี้ไม่สำคัญสำหรับความต้องการของฉัน
หาก UA ปิดใช้งานคุกกี้นี่จะเปลี่ยนเส้นทางไปยังหน้าต้นทางอีกครั้ง
อนุญาตการเชื่อมต่อ HTTP สำหรับการเปลี่ยนเส้นทาง
บนเซิร์ฟเวอร์ของฉันฉันมีกฎ Apache สำหรับบังคับใช้ HTTPS โดยไม่คำนึงถึงคำขอ:
<VirtualHost *:80>
ServerName example1.com
# if not on port 443 then 301 redirect to https while keeping any query string
RewriteEngine On
RewriteCond %{HTTP_HOST} ^example1\.com$ [NC]
RewriteCond %{SERVER_PORT} !443
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [L,QSA,R=301]
เพื่อให้เทคนิคการเปลี่ยนเส้นทางด้านบนใช้งานได้ฉันต้องการวิธีการอนุญาตการเชื่อมต่อ HTTP แบบมีเงื่อนไข มีหลายวิธีในการทำเช่นนี้ ฉันตัดสินใจว่าคุกกี้จะทำงาน
<VirtualHost *:80>
ServerName example1.com
# if not on port 443 then 301 redirect to https while keeping any query string
RewriteEngine On
RewriteCond %{HTTP_HOST} ^example1\.com$ [NC]
RewriteCond %{SERVER_PORT} !443
RewriteCond %{HTTP_COOKIE} !disable_ssl [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [L,QSA,R=301]
disable_ssl cookie จะถูกตั้งค่าในขั้นตอนที่ 2 จากนั้นลบในขั้นตอนที่ 3
Origin
ควรจะเหมือนเดิมอาจไม่พอดีกับกรณีการใช้งานของคุณแม้ว่า