На жаль, єдине загальне рішення цієї проблеми - це дати своїм користувачам 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, я б запропонував розділити конфігурацію на два різних VirtualHosts: один для порту 80 і один для порту 443. Вони не повинні мати точно однакову конфігурацію: просто не вкладайте те, що тільки для HTTPS у віртуального хоста HTTP взагалі.
Спосіб усунення вищезгаданих проблем - це використання суворої безпеки HTTP-транспорту для браузерів, які його підтримують (наскільки я знаю, це стосується всього хоста). Перше підключення може все-таки виявитись, якщо https://воно не використовується без перенаправлення, але можливий попередньо завантажений список сайтів, які очікують у https:// будь-якому випадку (і увімкнено для HSTS).