Защита сайта от кражи авторизационной cookie
Ожидает приглашения

Обнаружил, на мой взгляд, отличный способ защиты сайта от кражи авторизационной куки. Уверен, идея не нова и не оригинальна, но я раньше с ней не сталкивался, и самому такое в голову не приходило.
Теперь собственно сам способ, и как я его обнаружил. В одном моем проекте мне понадобилось сделать парсер страницы одного стороннего сайта. Доступ к данной странице был доступен только по авторизации. Я зарегистрировался, авторизовался и проанализировал способ авторизации на сайте. После отправки логина/пароля браузер получает две переменные куки — uid, содержащая число, и pass, содержащая некую алфавитно-числовую последовательность, похожую на md5. Ну, думаю, тут все просто. Создаю локальный php-скрипт, накидываю код для curl, в CURLOPT_COOKIE передаю полученные куки, и все. Так и произошло, я запустил скрипт и получил html-код нужной страницы.
Когда я перенес мой скрипт на веб-сервер и запустил его там, то вместо html-кода я получил пустой вывод, и curl_error мне тоже ничего не вывел. Я включил опцию CURLOPT_HEADER и увидел, что сайт мне возвращает 302-й редирект на страницу /login.php, т.е. авторизация не прошла. После этого последовали пару часов мучений, я менял параметры curl и значения заголовков header, но так и не мог попасть на желаемую страницу. В процессе я также попробовал открыть сайт на сервере с помощью текстового браузера w3m. Удалось открыть и успешно авторизоваться, т.е. по IP ограничения не было (веб-сервер в Европе).
Когда я зашел в тупик, решил сменить тактику и сделал отправку запроса авторизации с помощью curl, при этом включил сохранение headers и cookies в лог-файлы. И после просмотра данных файлов я все понял. Переменная pass содержала не просто md5 от пароля, как я изначально подумал, ее значение формировалось по некоторому алгоритму, и в нем присутствовала привязка к IP. Когда я взял значение pass из лог-файла и подставил в curl, то сразу получил желаемый результат.
Вариант алгоритма:
После успешной авторизации устанавливаем такие куки:
uid = <идентификатор пользователя>
pass = md5(<пароль пользователя> + <IP-адрес пользователя>)
При проверке куки, по идентификатору пользователя получаем его пароль, добавляем текущий IP-адрес, берем md5 от полученной конкатенации и сравниваем с кукой pass.
Мне очень понравился данный способ защиты. Можно не волноваться, если у вас уведут авторизационные куки, злоумышленник не сможет ими воспользоваться с отличного от вашего IP-адреса. Предлагаю всем, кто, как и я, раньше не использовал такой способ, начать его использовать. Сделаем сайты чуточку безопаснее.