จะป้องกันการเข้าถึงเว็บไซต์โดยไม่มีการเชื่อมต่อ SSL ได้อย่างไร?


11

ฉันมีเว็บไซต์ที่มีใบรับรอง SSL ติดตั้งอยู่ดังนั้นหากฉันเข้าถึงเว็บไซต์โดยใช้httpsแทนที่จะเป็นhttpฉันจะสามารถเชื่อมต่อโดยใช้การเชื่อมต่อที่ปลอดภัย

อย่างไรก็ตามฉันสังเกตเห็นว่าฉันยังสามารถเข้าถึงเว็บไซต์ที่ไม่ปลอดภัยเช่น โดยใช้แทนhttphttps

ฉันจะป้องกันผู้ใช้งานเว็บไซต์ในลักษณะที่ไม่ปลอดภัยได้อย่างไร

ถ้าฉันมีไดเรกทอรีบนเว็บไซต์เช่น samples/ฉันจะป้องกันการเชื่อมต่อที่ไม่ปลอดภัยกับไดเรกทอรีนี้ได้หรือไม่?

คำตอบ:


12

น่าเสียดายที่วิธีแก้ปัญหาทั่วไปสำหรับปัญหานี้คือให้ผู้ใช้ของคุณ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://ที่สำคัญกว่าให้แน่ใจว่าการเชื่อมโยงทั้งหมดที่ใช้ในส่วนการรักษาความปลอดภัย อย่าพึ่งพาการเปลี่ยนเส้นทางอัตโนมัติเพื่อทำงานให้คุณ ด้วยเหตุนี้ผมอยากแนะนำที่จะไม่ใช้มันเลยในระหว่างขั้นตอนการพัฒนา

อย่างไรก็ตามฉันสังเกตเห็นว่าฉันยังสามารถเข้าถึงเว็บไซต์ที่ไม่ปลอดภัยเช่น โดยใช้แทนhttphttps

นอกจากนี้ยังดูเหมือนว่าคุณกำลังใช้การตั้งค่าเดียวกันสำหรับทั้งสองและhttp httpsหากคุณกำลังใช้ Apache Httpd ฉันขอแนะนำให้แบ่งการกำหนดค่าออกเป็นสองส่วนVirtualHost: สำหรับพอร์ต 80 และอีกพอร์ตสำหรับพอร์ต 443 พวกเขาไม่จำเป็นต้องมีการกำหนดค่าเดียวกัน: เพียงแค่ไม่ใส่อะไรสำหรับ HTTPS เท่านั้น ในโฮสต์เสมือน HTTP เลย


วิธีหนึ่งในการลดปัญหาดังกล่าวข้างต้นคือใช้HTTP Strict Transport Securityสำหรับเบราว์เซอร์ที่รองรับ (ใช้กับโฮสต์ทั้งหมดเท่าที่ฉันรู้) การเชื่อมต่อครั้งแรกอาจยังคงปรากฏอยู่หากhttps://ไม่ได้ใช้หากไม่มีการเปลี่ยนเส้นทาง แต่เป็นไปได้ที่จะมีรายการไซต์ที่โหลดล่วงหน้าซึ่งคาดหวัง https://อยู่ดี (และเปิดใช้งานสำหรับ HSTS)


ข้อมูลที่ดี gmail ทำสิ่งนี้ได้อย่างไร - จากลักษณะของสิ่งที่พวกเขาบังคับให้ https
toomanyairmiles

3
พวกเขาใช้การเปลี่ยนเส้นทาง https://mail.google.comนี้ทำงานได้ดีโดยมีเงื่อนไขว่าคุณเป็นผู้ใช้คาดหวังว่ามันจะ หากเป็นผู้ใช้คุณจะเห็นว่ามันทำงานร่วมกับhttp://mail.google.comมีอาจเป็น MITM proxying https://mail.google.comการร้องขอไปยังแท้ น่าเสียดายที่ Gmail ไม่สามารถทำอะไรได้มากมายหากผู้ใช้ไม่ตรวจสอบ หลักการเดียวกับในชีวิตจริง: ถ้าอลิซต้องการคุยกับบ๊อบ แต่คุยกับชัค (ผู้ที่อ้างว่าเป็นบ๊อบ) แทนการยืนยัน ID บ๊อบจะไม่รู้เกี่ยวกับการสนทนานี้และจะไม่สามารถทำได้ อะไรก็ได้เกี่ยวกับมัน มันเป็นความรับผิดชอบของอลิซ
บรูโน

ฉันเห็นสคริปต์ PHP บางตัวซึ่งจะตรวจสอบว่าเชื่อมต่อกับ HTTPS และเปลี่ยนเส้นทางหรือไม่หากไม่ใช้ SSL ไปยังที่อยู่ HTTPS แน่นอนว่าไม่ใช่เรื่องง่ายเว้นแต่คุณจะสร้างเว็บไซต์ของคุณตอนนี้
เพนกวินไม่ระบุชื่อ

@ AnnonomusPerson นั่นเป็นหลักการเดียวกันและนั่นคือสิ่งที่กฎการเขียนใหม่จาก HTTP ไปยัง HTTPS ไม่ว่าคุณจะทำแบบเป็นโปรแกรมหรือโดยการกำหนดค่าไม่สำคัญก็ยังเป็นการเปลี่ยนเส้นทางกับคำขอเริ่มต้นใน HTTP ธรรมดาซึ่งนำเสนอปัญหาเดียวกัน
บรูโน่

3

ทั้งหมดที่คุณต้องเปลี่ยนเส้นทางการจราจร http เพื่อ https - ดูบทความนี้ 'เปลี่ยนเส้นทาง http เพื่อ https Apache ที่เชื่อถือได้ของการเชื่อมต่อ - แรง HTTPS เชื่อมต่อ'

สำหรับไดเร็กทอรีย่อยให้วางสิ่งนี้ไว้ในไฟล์ htaccess ในไดเร็กทอรีเอง

RewriteEngine on
RewriteCondition %{SERVER_PORT} !^443$
RewriteRule ^(.*)$ https://www.maindomain.com/directory/$1 [R=301,L] 

คุณสามารถทำให้สิ่งนี้เกิดขึ้นได้เฉพาะกับไดเรกทอรีย่อยบางอัน
CJ7

@CraigJ ขออภัยพลาดส่วนไดเรกทอรีย่อยคำตอบอัพเดท
toomanyairmiles

3
แม้ว่านี่จะเป็นการลดความเสี่ยงลงเล็กน้อย แต่ก็ไม่สามารถทำงานกับผู้โจมตี MITM
บรูโน่

0

การบังคับให้เข้าถึงผ่าน HTTPS นั้นเป็นไปได้จริงนอกเหนือจากการเป็นขั้นตอนที่จำเป็นในการทำให้ไซต์ของคุณเป็น MITM-, snooper- และ PEBKAC มันไม่ควรจะเป็นความรับผิดชอบของผู้ใช้ที่ไม่ได้ทำงาน สนับสนุนให้ผู้ใช้ของคุณใช้เบราว์เซอร์ที่ปลอดภัยแทน

การบังคับใช้ HTTPS ทำได้ผ่าน HSTS ( HTTP Strict-Transport-Security ) HSTS ขั้นพื้นฐานมีความปลอดภัยหลังจากผู้ใช้เข้าถึงเว็บไซต์ของคุณผ่าน HTTPS เป็นครั้งแรก (ในเบราว์เซอร์ที่สนับสนุนทั้งหมดIE ขาดความสามารถ ) HSTS ที่โหลดไว้ล่วงหน้ามีความปลอดภัยอยู่เสมอและครอบคลุมเบราว์เซอร์รุ่นใหม่ที่รวดเร็ว (Chromium และ Derivatives, Firefox)

สำหรับภาพรวมที่สมบูรณ์ยิ่งขึ้นของการรักษาความปลอดภัย HTTP (การระบุ URL การเปลี่ยนเส้นทางคุกกี้และเนื้อหาแบบผสม) ดูการย้าย HTTPS นี้ได้อย่างไร HSTS เป็นขั้นตอนสุดท้ายในการย้ายถิ่นฐานแบบก้าวหน้า คุณไม่จำเป็นต้องทำตามคำสั่งซื้อจริงๆหากเว็บไซต์ของคุณเป็นแบรนด์ใหม่

มาตรฐานที่เกี่ยวข้อง: คุกกี้ที่ปลอดภัย (สำคัญหากคุกกี้ของคุณใช้เวลานานกว่าส่วนหัว HSTS), คุกกี้ HttpOnly (ในขณะที่คุณรักษาความปลอดภัยคุกกี้ของคุณ), HPKP (สำหรับเบราว์เซอร์ที่ทันสมัยและผู้โจมตีที่มีทรัพยากรมากขึ้น)

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