น่าเสียดายที่วิธีแก้ปัญหาทั่วไปสำหรับปัญหานี้คือให้ผู้ใช้ของคุณhttps://
เท่านั้นและตรวจสอบให้แน่ใจว่าพวกเขาคาดหวังว่าจะใช้สิ่งนั้นเท่านั้น ในที่สุดมันก็เป็นความรับผิดชอบของผู้ใช้ในการตรวจสอบว่าพวกเขากำลังใช้ SSL / TLS ตามที่พวกเขาคาดหวัง
โซลูชันอื่น ๆ มีความเสี่ยงต่อการโจมตีจากคนกลางแม้ว่าเว็บไซต์จะยอมรับการเชื่อมต่อ SSL / TLS เท่านั้น ผู้โจมตีสามารถสกัดกั้นการรับส่งข้อมูลhttp://example.com
(ตามที่ผู้ใช้ร้องขอแม้ว่าexample.com
จะไม่ได้ฟังพอร์ตนั้น) และแทนที่โดยทำการเชื่อมต่อด้วยตนเองhttps://example.com
โดยใช้พร็อกซีกลับไปที่ผู้ใช้
มีกฎ OWASP สำหรับการเปลี่ยนเส้นทางอัตโนมัติเนื่องจากสิ่งนี้ มันถูกลบไปแล้วอาจเป็นสาเหตุให้การเปลี่ยนเส้นทางไม่ใช่วิธีที่ไม่ดีในการลดความเสี่ยง (โดยเฉพาะกับผู้ดักฟังที่แฝงตัว) แต่ไม่ได้แก้ปัญหาพื้นฐาน
มีเทคนิคต่าง ๆ ที่คุณสามารถใช้เพื่อแนะนำผู้ใช้ไปยังไซต์ HTTPS และไม่ใช่ความคิดที่ดีที่จะใช้พวกเขา (แม้ว่าจะไม่ป้องกันพวกเขาจากผู้โจมตี MITM ที่ใช้งานอยู่)
ประการแรกหากคุณไม่มีสิ่งใดที่ควรให้บริการใน HTTP ธรรมดาบนเว็บเซิร์ฟเวอร์ให้ปิดพอร์ต 80 (เช่นลบListen 80
ในการกำหนดค่าของ Apache Httpd) ผู้ใช้จะต้องใช้งานhttps://
ตลอดเวลาซึ่งอาจไม่สะดวก
ประการที่สองในส่วนกำหนดค่า Apache Httpd ของคุณสำหรับพา ธ ที่ระบุ ( Location
หรือDirectory
) ใช้SSLRequireSSL
คำสั่ง : จะต้องใช้ SSL / TLS (แม้ว่าคุณจะกำหนดค่าไว้บนพอร์ตอื่นแล้วก็ตาม) เว็บเซิร์ฟเวอร์อื่น ๆ อาจมีคำสั่งที่คล้ายกัน
ประการที่สามคุณสามารถใช้การเปลี่ยนเส้นทางไม่ว่าจะใช้mod_rewrite
หรือภายในรหัสของคุณ (หากเป็นแอปพลิเคชัน) สิ่งนี้ควรทำสำหรับสถานที่เฉพาะ ( ดูHTTPS
ตัวแปรพิเศษคุณสามารถใช้ 302 ได้เช่นกัน แต่ 301 จะดีกว่าหากนี่เป็นการถาวรมากกว่า):
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^(samples/.*)$ https://example.com/$1 [R=301,L]
https://
ที่สำคัญกว่าให้แน่ใจว่าการเชื่อมโยงทั้งหมดที่ใช้ในส่วนการรักษาความปลอดภัย อย่าพึ่งพาการเปลี่ยนเส้นทางอัตโนมัติเพื่อทำงานให้คุณ ด้วยเหตุนี้ผมอยากแนะนำที่จะไม่ใช้มันเลยในระหว่างขั้นตอนการพัฒนา
อย่างไรก็ตามฉันสังเกตเห็นว่าฉันยังสามารถเข้าถึงเว็บไซต์ที่ไม่ปลอดภัยเช่น โดยใช้แทนhttp
https
นอกจากนี้ยังดูเหมือนว่าคุณกำลังใช้การตั้งค่าเดียวกันสำหรับทั้งสองและhttp
https
หากคุณกำลังใช้ Apache Httpd ฉันขอแนะนำให้แบ่งการกำหนดค่าออกเป็นสองส่วนVirtualHost
: สำหรับพอร์ต 80 และอีกพอร์ตสำหรับพอร์ต 443 พวกเขาไม่จำเป็นต้องมีการกำหนดค่าเดียวกัน: เพียงแค่ไม่ใส่อะไรสำหรับ HTTPS เท่านั้น ในโฮสต์เสมือน HTTP เลย
วิธีหนึ่งในการลดปัญหาดังกล่าวข้างต้นคือใช้HTTP Strict Transport Securityสำหรับเบราว์เซอร์ที่รองรับ (ใช้กับโฮสต์ทั้งหมดเท่าที่ฉันรู้) การเชื่อมต่อครั้งแรกอาจยังคงปรากฏอยู่หากhttps://
ไม่ได้ใช้หากไม่มีการเปลี่ยนเส้นทาง แต่เป็นไปได้ที่จะมีรายการไซต์ที่โหลดล่วงหน้าซึ่งคาดหวัง https://
อยู่ดี (และเปิดใช้งานสำหรับ HSTS)