Thật không may, giải pháp chung duy nhất cho vấn đề này là chỉ cung cấp cho người dùng của bạn https://
và đảm bảo rằng họ sẽ chỉ sử dụng nó. Cuối cùng, trách nhiệm của người dùng là kiểm tra xem họ có đang sử dụng SSL / TLS như họ mong đợi hay không.
Các giải pháp khác dễ bị tấn công giữa chừng, ngay cả khi trang web chỉ chấp nhận kết nối SSL / TLS. Kẻ tấn công có thể chặn lưu lượng truy cập http://example.com
(theo yêu cầu của người dùng, ngay cả khi thậm chí example.com
không nghe trên cổng đó) và thay thế nó bằng cách tự kết nối với họ https://example.com
, ủy quyền lại cho người dùng.
Có một quy tắc OWASP chống lại chuyển hướng tự động vì điều này. Nó đã được gỡ bỏ, có thể là do chuyển hướng không phải là một cách tồi để giảm thiểu rủi ro (đặc biệt là chống lại những kẻ nghe trộm thụ động), nhưng không giải quyết được vấn đề cơ bản.
Có nhiều kỹ thuật khác nhau mà bạn có thể sử dụng để hướng dẫn người dùng đến trang web HTTPS và không nên sử dụng chúng (mặc dù nó sẽ không bảo vệ họ trước những kẻ tấn công MITM đang hoạt động).
Đầu tiên, nếu bạn không có bất cứ thứ gì nên được phục vụ trong HTTP đơn giản trên máy chủ web, hãy tắt cổng 80 (ví dụ: loại bỏ Listen 80
trong cấu hình của Apache httpd). Người dùng sẽ phải sử dụng https://
mọi lúc, điều này có thể gây bất tiện.
Thứ hai, trong phần cấu hình Apache httpd của bạn cho một con đường cụ thể (một trong hai Location
hoặc Directory
), sử dụng SSLRequireSSL
chỉ thị : nó sẽ yêu cầu sử dụng của SSL / TLS (ngay cả khi bạn đã cấu hình nó trên một cổng khác trên thực tế). Các máy chủ web khác có thể có chỉ thị tương tự.
Thứ ba, bạn có thể sử dụng chuyển hướng, bằng cách sử dụng mod_rewrite
hoặc trong mã của mình (nếu đó là một ứng dụng). Một cái gì đó như thế này sẽ làm, đối với một vị trí cụ thể ( xem HTTPS
biến đặc biệt ; bạn cũng có thể sử dụng 302, nhưng 301 sẽ tốt hơn nếu điều này là lâu dài hơn):
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^(samples/.*)$ https://example.com/$1 [R=301,L]
Quan trọng hơn, đảm bảo rằng tất cả các liên kết đến phần an toàn đó sử dụng https://
. Không bao giờ dựa vào chuyển hướng tự động để thực hiện công việc cho bạn. Vì lý do này, tôi khuyên bạn không nên sử dụng nó trong giai đoạn phát triển .
Tuy nhiên, tôi đã nhận thấy rằng tôi vẫn có thể truy cập trang web một cách không an toàn, tức là. bằng cách sử dụng http
thay vì https
.
Điều này cũng có vẻ như bạn đang sử dụng cùng một cấu hình cho cả hai http
và https
. Nếu bạn đang sử dụng Apache Httpd, tôi khuyên bạn nên chia cấu hình thành hai phần riêng biệt VirtualHost
: một cho cổng 80 và một cho cổng 443. Họ không phải có cùng cấu hình: chỉ không đặt những gì chỉ dành cho HTTPS trong máy chủ ảo HTTP cả.
Một cách để giảm thiểu các vấn đề được đề cập ở trên là sử dụng HTTP Strict Transport Security , cho các trình duyệt hỗ trợ nó (áp dụng cho toàn bộ máy chủ theo như tôi biết). Kết nối đầu tiên vẫn có thể bị lộ nếu https://
không được sử dụng mà không có chuyển hướng, nhưng dù sao cũng có thể có một danh sách các trang web được tải sẵn mong đợi https://
(và được bật cho HSTS).