Codeigniter сеансовые куки и опция запомнить меня - PullRequest
2 голосов
/ 17 сентября 2011

Привет, я пишу функцию авторизации, ну, мне нужно добавить типичный флажок запомнить меня, чтобы сессия не заканчивалась.

Какая лучшая практика для этого?

Я думал о добавлении куки-файла и сохранении его внутри идентификатора пользователя, затем, когда пользователь в первый раз просматривает сайт, проверим наличие этого cookie-файла, если он существует, я беру идентификатор пользователя из cookie-файла и создаю сеанс, это право способ сделать это? как насчет безопасности?

Ответы [ 2 ]

2 голосов
/ 17 сентября 2011

Вот как я бы это сделал:

Создайте столбец с именем "Remember_code" и создайте случайно сгенерированный хэш, когда они отмечают "запомнить меня"

Установите Cookie с обоими запомнить_ кодомвместе с личностью пользователя (логин или адрес электронной почты).

Когда они пытаются повторно войти, проверьте оба: запомнить_код из базы данных, а также имя пользователя / адрес электронной почты, и, если они верны, зарегистрируйте их автоматически.

Эта практика, как правило, безопасна,но чтобы проверить дважды, вы можете проверить IP или User Agent, чтобы убедиться, что это правильный пользователь.

0 голосов
/ 04 июня 2018

Я реализовал несколько другое решение на CodeIgniter 3.

Я рассматриваю опцию "Помни меня" как продление времени сеанса. И. е. стандартное время сеанса 2 часа, продлено 7 дней.

Для этого:

1 - добавить флажок запомнить меня и скрытое поле в форму

echo form_hidden('remember_me', '0');
echo form_checkbox('remember_me', '1');

2 - добавить ниже к конфигурации (config.php)

$config['sess_expiration'] = 72000; // standard time, 2hrs
$config['sess_extended_expiration'] = 604800; // extended time, 7 days

3 - Создать MY_Session.php в каталоге application/libraries/Session.

4 - поставить ниже код

<?php

defined('BASEPATH') OR exit('No direct script access allowed');

class MY_Session extends CI_Session {

    public function __construct(array $params = array())
    {
        parent::__construct($params);

        // No session time manipulation
        if (!isset($this->_config['sess_extended']))
        {
            return $this;
        }

        if ($this->_config['sess_extended'])
        {
            // Remember for next regenerate execs
            setcookie(
                'remember_me',
                '1',
                (empty($this->_config['cookie_lifetime']) ? 0 : time() + $this->_config['cookie_lifetime']),
                $this->_config['cookie_path'],
                $this->_config['cookie_domain'],
                $this->_config['cookie_secure'],
                TRUE
            );
        }
        else
        {
            // Forget remember me
            setcookie(
                'remember_me',
                NULL,
                -1,
                $this->_config['cookie_path'],
                $this->_config['cookie_domain'],
                $this->_config['cookie_secure'],
                TRUE
            );
        }
    }

    protected function _configure(&$params)
    {
        // Restore standard session time
        if (filter_input(INPUT_POST, 'remember_me') === '0')
        {
            $params['sess_extended'] = false;
            return parent::_configure($params);
        }
        // Extend session time
        elseif (filter_input(INPUT_POST, 'remember_me') === '1' || (isset($_COOKIE['remember_me']) && !empty($_COOKIE['remember_me'])))
        {
            if (!empty(config_item('sess_extended_expiration')))
            {
                $_config[0] = & get_config();
                $_config[0]['sess_expiration'] = config_item('sess_extended_expiration');
                $_config[0]['sess_time_to_update'] = 0;

                $params['sess_extended'] = true;
            }
        }

        return parent::_configure($params);
    }

}

Нет никаких последствий для безопасности, это только расширенное время сеанса.

Также помните, что сервер должен разрешать длительное время сеанса. Вы можете проверить текущий таймаут по

var_dump(ini_get('session.gc_maxlifetime'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...