Niestety, jedynym ogólnym rozwiązaniem tego problemu jest zapewnienie użytkownikom https://jedynego i upewnienie się, że oczekują tylko tego. Ostatecznym obowiązkiem użytkownika jest sprawdzenie, czy korzysta on z SSL / TLS, zgodnie z oczekiwaniami.
Inne rozwiązania są podatne na ataki typu man-in-the-middle, nawet jeśli witryna akceptuje tylko połączenia SSL / TLS. Atakujący mogą przechwycić ruch do http://example.com(zgodnie z żądaniem użytkownika, nawet jeśli nawet example.comnie nasłuchuje na tym porcie) i zastąpić go, nawiązując własne połączenie z https://example.comserwerem proxy i przesyłając go z powrotem do użytkownika.
Z tego powodu istniała reguła OWASP przeciwko automatycznym przekierowaniom. Został usunięty, prawdopodobnie dlatego, że przekierowania nie są złym sposobem na ograniczenie ryzyka (szczególnie w przypadku pasywnego podsłuchiwania), ale nie rozwiązują podstawowego problemu.
Istnieją różne techniki, których można użyć, aby poprowadzić użytkownika do strony HTTPS, i nie jest to zły pomysł, aby z nich korzystać (chociaż nie ochroni ich przed aktywnymi atakującymi MITM).
Po pierwsze, jeśli nie masz w ogóle niczego, co powinno być podawane w zwykłym HTTP na serwerze WWW, wyłącz port 80 (np. Usuń Listen 80w konfiguracji Apache Httpd). Użytkownicy będą musieli korzystać https://przez cały czas, co może być niewygodne.
Po drugie, w sekcji konfiguracji Apache Httpd dla konkretnej ścieżki (albo Locationalbo Directory), użyj SSLRequireSSLdyrektywy : będzie wymagało użycia SSL / TLS (nawet jeśli skonfigurowałeś go na alternatywnym porcie). Inne serwery sieciowe prawdopodobnie mają podobne dyrektywy.
Po trzecie, możesz użyć przekierowania, używając mod_rewritelub w kodzie (jeśli jest to aplikacja). Coś takiego powinno być zrobione dla konkretnej lokalizacji ( zobacz HTTPSzmienną specjalną ; możesz także użyć 302, ale 301 jest lepsze, jeśli ma to być bardziej trwałe):
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^(samples/.*)$ https://example.com/$1 [R=301,L]
Co ważniejsze, upewnij się, że wszystkie linki do tej bezpiecznej sekcji korzystają https://. Nigdy nie polegaj na automatycznym przekierowaniu, aby wykonać zadanie za Ciebie. Z tego powodu odradzam używanie go w ogóle na etapie programowania .
Zauważyłem jednak, że nadal mogę bezpiecznie uzyskiwać dostęp do witryny, tj. za pomocą httpzamiast https.
Brzmi to również tak, jakbyś używał tej samej konfiguracji zarówno dla, jak httpi dla https. Jeśli używasz Apache Httpd, sugerowałbym podzielenie konfiguracji na dwa odrębne VirtualHosts: jeden dla portu 80 i jeden dla portu 443. Nie muszą mieć dokładnie tej samej konfiguracji: po prostu nie umieszczaj tego, co jest tylko dla HTTPS w ogóle wirtualnego hosta HTTP.
Sposobem na złagodzenie wyżej wymienionych problemów jest użycie protokołu HTTP Strict Transport Security w przeglądarkach, które go obsługują (o ile wiem, dotyczy całego hosta). Pierwsze połączenie może być nadal widoczne, jeśli https://nie jest używane bez przekierowania, ale możliwe jest, aby mieć wstępnie załadowaną listę witryn, które i https:// tak oczekują (i włączone dla HSTS).