Когда применение SSL не представляется возможным, можно продолжить аутентификацию пользователей за счет хранения наряду с остальными сведениями их IP-адресов. Для этого нужно при сохранении их сессии добавить следующую строку кода:
$_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
Затем в качестве дополнительной меры контроля при любой загрузке страницы и доступности сессии проводится следующая проверка, которая при несоответствии текущего IP-адреса сохраненному вызывает функцию different_user
:
if ($_SESSION['ip'] != $_SERVER['REMOTE_ADDR']) different_user();
Какой код будет у функции different_user
— решать вам, но мы рекомендуем просто удалить текущую сессию и попросить пользователя пройти повторную регистрацию вследствие технической ошибки. Больше ни о чем сообщать не нужно, иначе произойдет утечка потенциально ценной информации.
Разумеется, нужно принимать в расчет, что пользователи, работающие через один и тот же прокси-сервер или использующие одинаковые общие IP-адреса в домашней или офисной сети, будут иметь один и тот же IP-адрес. Если это вызовет проблему, нужно опять обратиться к протоколу SSL. Можно также сохранить копию браузер-ной строки агента пользователя (той самой строки, которую разработчики помещают в свои браузеры, для того чтобы идентифицировать их по типу и версии), с помощью которой также возможно отличить пользователей друг от друга благодаря существованию широкого выбора типов, версий и компьютерных платформ. Для сохранения агента пользователя можно воспользоваться следующим кодом:
$_SESSION['ua'] = $_SERVER['HTTP_USER_AGENT'];
А для сравнения текущей строки агента с сохраненной можно воспользоваться следующим кодом:
if ($_SESSION['ua'] != $_SERVER['HTTP_USER_AGENT']) different_user();
Или, что еще лучше, можно объединить эти две проверки и сохранить их комбинацию в виде шестнадцатеричной строки, получаемой от функции md5
:
$_SESSION["check" = md5($_SERVER['REMOTE_ADDR']
$_SERVER['HTTP_USER_AGENT']);
Для сравнения текущей и сохраненной строк можно воспользоваться следующим кодом:
if ($_SESSION['check'] != md5($_SERVER['REMOTE_ADDR'] .
$_SERVER['HTTP_USER_AGENT'])) different_user():
Безопасность сессии | Предотвращение фиксации сессии |