Обновление. Обратите внимание, что каждый веб-сайт, переключающийся между незащищенными HTTP и зашифрованными HTTPS-страницами, неизбежно склонен к SSL-полосе. Пожалуйста, подумайте об использовании HTTPS для всего сайта, хотя это не может предотвратить SSL-полосу, по крайней мере, это дает пользователю возможность безопасно звонить на сайт, если он заботится. Для сайтов, которые необходимо переключить, этот метод, вероятно, по-прежнему является лучшим вариантом.
Это распространенный сценарий, что на веб-сайте есть страницы с конфиденциальными данными, к которым следует обращаться только с протоколом HTTPS и другими с некритичными данными.
Я нашел решение, которое позволяет переключаться между безопасными и небезопасными страницами, сохраняя сеанс и хотел бы задать вам какие-либо намеки на недостатки в концепции. Вся статья вы можете найти здесь: Безопасный сеансовый файл с SSL (конечно, я тоже рад слышать, что это безопасно).
Проблема
HTTPS гарантирует, что никто между клиентом и сервером не сможет подслушивать наше общение и предотвращает атаку "человек-в-середине". К сожалению, это не относится к cookie сеанса, оно также отправляется в незашифрованные запросы.
PHP предлагает функцию session_set_cookie_params (...) с параметром $secure. Это то, что нам нужно, но это оставляет нам проблему, что мы теряем нашу сессию, когда переходим на незащищенную страницу.
Файл cookie аутентификации
Идея файла cookie аутентификации заключается в том, что когда пользователь вводит свой пароль (увеличивает его права доступа), мы создаем второй файл cookie дополнительно к незащищенному cookie-сеансу и следим за тем, чтобы к нему были доступны только зашифрованные HTTPS-страницы.
https://www.example.com/login.php
<?php
session_start();
// regenerate session id to make session fixation more difficult
session_regenerate_id(true);
// generate random code for the authentication cookie and store it in the session
$authCode = md5(uniqid(mt_rand(), true));
$_SESSION['authentication'] = $authCode;
// create authentication cookie, and restrict it to HTTPS pages
setcookie('authentication', $authCode, 0, '/', '', true, true);
print('<h1>login</h1>');
...
?>
Теперь каждая страница (HTTPS и HTTP) может читать небезопасный файл cookie сеанса, но страницы с конфиденциальной информацией могут проверять файл cookie с защищенной аутентификацией.
https://www.example.com/secret.php
<?php
session_start();
// check that the authentication cookie exists, and that
// it contains the same code which is stored in the session.
$pageIsSecure = (!empty($_COOKIE['authentication']))
&& ($_COOKIE['authentication'] === $_SESSION['authentication']);
if (!$pageIsSecure)
{
// do not display the page, redirect to the login page
}
...
?>
Злоумышленник может манипулировать файлом cookie сеанса, но он никогда не имеет доступа к файлу cookie аутентификации. Только человек, который ввел пароль, может владеть файлом cookie аутентификации, он всегда отправляется через зашифрованные HTTPS-соединения.
Спасибо за каждый ответ!