Pull to refresh

Безопасность на хабре

Reading time2 min
Views2K
А расскажу я вам сегодня про фичу, которую совсем недавно мне понадобилось сделать в одном проекте. А именно о функции «Запомнить меня на этом компьютере». Смешно не правда ли? Что же тут сложного? Сохраняй куки на две недели, месяц, потом вытаскивай и восстанавливай сессию. Ага, всё просто. А я встал в тупик. Меня часто ставят в тупик самые простые вещи.Так что же меня смутило…

А какие куки хранить, задумался я. Id пользователя и хэш пароля? Именно эти данные хранятся в куках, например, на vkontakte.ru. Как-то для меня слишком в лоб и по-детски. Для чего же тогда в базе хранить хэш пароля? Правильно, чтобы злоумышленник, заполучив этот самый хэш, не смог им воспользоваться или, по крайней мере, очень долго бы его расшифровывал. Получается vkontakte — рай для злоумышленников. Украл хэш, загнал его в куки и улыбнулся=)

И решил посмотреть я, как же это реализовано на хабре. И нашёл только одну куку PHPSESSID. Получается, хабр хранит только идентификатор сессии (время жизни куки истекает где-то в 2047 году), а сама сессия на сервере имеет увеличенное время жизни (около месяца, насколько я понял). Вот то что мне нужно, подумал я. Просто, лаконично и со вкусом. Одна стандартная кука.

Но кое-что меня опять смутило. И я провёл эксперимент. Я разлогинился с хабра и создал ручками в браузере эту самую куку PHPSESSID со значением 1111111111. Потом залогинился. Кука и её значение остались такими же, т.е. PHPSESSID=1111111111. Дальше на другом компьютере с другим ip и в другом браузере я опять создал куку PHPSESSID=1111111111. И опаньки, я залогинен на хабре=))

А теперь маниакальный сценарий использования этого метода злоумышленником. Приходит злоумышленник в общественную точку доступа (интернет-кафе) и прописывает на комьютере (или на всех) куку PHPSESSID с известным ему значением. Потом идёт домой и пишет простой скрипт, который обращается к хабру и проверяет сессию с этой кукой раз в n минут. И идёт пить пиво. В интернет-кафе приходит активный хабраюзер Вася и логинится на хабре. Через n минут он обнаруживает, что его выкинуло с сайта и обратно войти он уже не может. А злоумышленник покупает себе ещё пива. Занавес.

Может сценарий ну просто чересчур маниакальный, да и кому может понадобиться чей-то аккаунт на хабре? Ну во-первых, недовольных своей кармой много (например, я=))). Во-вторых, такой метод хранения сессии может быть реализован и на более серьёзных сервисах.

Ну и сколько раз нас тут учили не доверять данным, пришедшим от пользователя? Ага, даже если это сессионная кука! А решение очень простое: ищем сессионную куку среди активных сессий на сервере, если совпадений нет генерируем новый идентификатор и устанавливаем новую куку.

А ты перестраховался, %username%?
Tags:
Hubs:
+129
Comments68

Articles

Change theme settings