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.com
nie nasłuchuje na tym porcie) i zastąpić go, nawiązując własne połączenie z https://example.com
serwerem 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 80
w 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 Location
albo Directory
), użyj SSLRequireSSL
dyrektywy : 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_rewrite
lub w kodzie (jeśli jest to aplikacja). Coś takiego powinno być zrobione dla konkretnej lokalizacji ( zobacz HTTPS
zmienną 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ą http
zamiast https
.
Brzmi to również tak, jakbyś używał tej samej konfiguracji zarówno dla, jak http
i dla https
. Jeśli używasz Apache Httpd, sugerowałbym podzielenie konfiguracji na dwa odrębne VirtualHost
s: 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).