Я создаю функцию «Запомнить меня» в Codeigniter, обычно я вижу, что библиотеки / проекты устанавливают cookie на пользователя с помощью токена, этот токен сохраняется в базе данных и сравнивается каждый раз, когда пользователь обращается к веб-сайту.
В Codeigniter мы можем установить время окончания сеанса, но это заставило меня попробовать другой подход, вот что я сделал:
Поэтому мой код входа выглядит следующим образом:
if (!$this->input->post('remember_me')) { $this->session->sess_expiration = 7200; $this->session->sess_expire_on_close = TRUE; } $this->session->set_userdata($session_data);
И мой файл конфигурации:
$config['sess_expiration'] = 0; $config['sess_expire_on_close'] = FALSE;
Я не вижу людей, использующих это решение для проектов, я тестировал это, и, похоже, он работает нормально.
Итак, по моему вопросу, вы бы сказали, что это безопасная практика? О безопасности, о которой я должен знать? Любой вход на этом решении vs cookie + токен базы данных будет отличным.
Самое простое решение, которое я нашел для этой проблемы, – это просто изменить файл cookie, созданный Codeigniter таким образом:
$this->session->set_userdata('user', $user); // a cookie has been created if($this->input->post('remember_me')) { $this->load->helper('cookie'); $cookie = $this->input->cookie('ci_session'); // we get the cookie $this->input->set_cookie('ci_session', $cookie, '35580000'); // and add one year to it's expiration }
Также это можно сделать путем редактирования / расширения системной библиотеки сеансов.
Во-первых: установите время истечения срока действия сеанса в файле конфигурации. Второе: в функции входа пользователя добавить помнить меня,
if($remember) { $data['new_expiration'] = 60*60*24*30;//30 days $this->session->sess_expiration = $data['new_expiration']; } $this->session->set_userdata($data);
В-третьих: Редактирование системной библиотеки сеансов [я не уверен, будет ли продолжен сеанс работы работать или нет] Перейти к этой строке в sess_read()
if (($session['last_activity'] + $this->sess_expiration) < $this->now)
Перед этой строкой добавьте следующий код
if(isset($session['new_expiration'])){ $this->sess_expiration = $session['new_expiration']; }
Это отлично работает для меня.
Я не могу сказать, что это неправильно, но я могу сказать вам, как это сделать:
Сначала я установил, что сеанс истекает в браузере, когда он работает с временем безотказной работы 7200.
Затем:
Вход в систему устанавливает пользовательские данные сеанса
«Запомнить меня» устанавливает отдельный файл cookie (я храню зашифрованный хэш, содержащий адрес электронной почты пользователя + пароль + id, т. Е.: Md5 (pass + email + id))
Каждый раз, когда пользователь загружает страницу, я управляю, если существует помнить, что cookie существует, если существует, я создаю сеанс пользователя.
Единственное, что я знаю, это сеанс, который использует ключ шифрования, вредоносному злоумышленнику потребуется время для дешифрования, поэтому чем меньше ключ сеанса, тем меньше времени у злоумышленника для дешифрования текущего ключа.
Я всегда избегаю сеанса, чтобы не истекать, поэтому Запомнить меня, всегда что-то не очень хорошо для безопасности, я думаю, но в любом случае пользователь может выбрать или нет, если использовать эту функцию;)