Auth_Storage_Cookie->clear() перезапишет куку на клиенте. Но сервер об этом факте забудет после окончания выполнения скрипта. Использованный _publicKey нигде не будет отмечен как «невалдиный».
Поэтому может быть следующая последовательность событий (предположим, что session.gc_maxlifetime — 30 минут) и в конструктор не передали другой $keyLifetime.
23:40 у меня увели куки (скопировали в «безопасное место» $_COOKIE[_k], $_COOKIE[_v]).
23:50 я нажимаю кнопку «выход», сервер стирает $_COOKIE[_k], $_COOKIE[_v] в браузере, в котором я работал (копия, сделанная в 23:40, при этом не стирается, т.к. браузер и тем более сервер понятия не имеет где она находится); я ухожу.
23:55 злоумышленник садится на мое место, выставляет нужные значения $_COOKIE (они у него скопированы в 23:40 и никуда не делись) и отправляет запрос на сервер с этими куками.
Если я не ошибаюсь, сервер его пропустит и авторизует под моим аккаунтом. Если это не верно, то укажите, пожалуйста, какой метод Вашего класса заблокирует такой запрос.
P.S. И спасибо за coding standarts — читать код удобно.
Разница в том, что в сессию по нажатию пользователем кнопки «выход» вы можете записать соответствующую информацию о том, что пользователь разлогинен. Эта инфа будет храниться на сервере, поэтому злоумышленник, даже уведя сессионную куку, не сможет ей воспользоваться.
А в вашем варианте — эта инфа на сервере не хранится, поэтому кнопка «выход» не сработает.
По-моему, в простом варианте получаем практически неотключаемую фичу «Запомнить меня».
Т.е. можно еще в SessionData добавить время T — время создания формирования Kpub. При заходе проверять разницу между текущим временем и T при превышении какого-то предела просить перелогиниться. Но это как-то криво.
Да, к сожалению, пока не было времени залезть в код, поэтому все замечания пишу только исходя из общей концепции, а не реализации.
Смотрите. Допустим, я логинюсь с чужого компьютера. Сервер формирует новый публичный ключ Kpub; шифрует мои сессионные данные на этом ключе и на секретном ключе Кpr (с привязкой к IP, если она включена), записывает две куки — Kpub; Encrypted(Kpub, Kpr, SessionData, IP). Потом я что-то делаю и выхожу.
Что мешает хозяину компьютера увести у меня эти две куки во время работы, дождаться пока я выйду, и передать на сервер их же, выдав себя за меня? Вся информация у него есть, информация о сроке жизни Kpub на сервере вроде как не хранится (иначе при его проверке нужно будет также лезть или в БД или в файл или в какое-то еще хранилище).
Auth_Storage_Cookie->clear() перезапишет куку на клиенте. Но сервер об этом факте забудет после окончания выполнения скрипта. Использованный _publicKey нигде не будет отмечен как «невалдиный».
Поэтому может быть следующая последовательность событий (предположим, что session.gc_maxlifetime — 30 минут) и в конструктор не передали другой $keyLifetime.
23:40 у меня увели куки (скопировали в «безопасное место» $_COOKIE[_k], $_COOKIE[_v]).
23:50 я нажимаю кнопку «выход», сервер стирает $_COOKIE[_k], $_COOKIE[_v] в браузере, в котором я работал (копия, сделанная в 23:40, при этом не стирается, т.к. браузер и тем более сервер понятия не имеет где она находится); я ухожу.
23:55 злоумышленник садится на мое место, выставляет нужные значения $_COOKIE (они у него скопированы в 23:40 и никуда не делись) и отправляет запрос на сервер с этими куками.
Если я не ошибаюсь, сервер его пропустит и авторизует под моим аккаунтом. Если это не верно, то укажите, пожалуйста, какой метод Вашего класса заблокирует такой запрос.
P.S. И спасибо за coding standarts — читать код удобно.
А в вашем варианте — эта инфа на сервере не хранится, поэтому кнопка «выход» не сработает.
Т.е. можно еще в SessionData добавить время T — время создания формирования Kpub. При заходе проверять разницу между текущим временем и T при превышении какого-то предела просить перелогиниться. Но это как-то криво.
Да, к сожалению, пока не было времени залезть в код, поэтому все замечания пишу только исходя из общей концепции, а не реализации.
Что мешает хозяину компьютера увести у меня эти две куки во время работы, дождаться пока я выйду, и передать на сервер их же, выдав себя за меня? Вся информация у него есть, информация о сроке жизни Kpub на сервере вроде как не хранится (иначе при его проверке нужно будет также лезть или в БД или в файл или в какое-то еще хранилище).