Как CodeIgniter знает, что cookie содержит действительные данные сеанса?

В CodeIgniter данные сеанса сохраняются в файле cookie по умолчанию. Но также должен быть файл на моем сервере (названный как идентификатор сеанса), чтобы убедиться, что данные (в cookie) действительны или я ошибаюсь?

Я ищу место, где сохраняются сеансы. Я уже просматривал каталог «session.save_path» (/ var / lib / php5), но в этом каталоге есть только другие сеансы, но не сеансы CodeIgniter.

Я также не сохраняю сеансы в базе данных, так как CodeIgniter знает, что данные (в cookie) действительны?

Solutions Collecting From Web of "Как CodeIgniter знает, что cookie содержит действительные данные сеанса?"

Утилита native codeigniter переопределяет регулярную обработку сеанса PHP и использует собственную систему обработки данных, которая является причиной того, что вы не можете найти ее в обычных местах. (также я хотел бы упомянуть, что лично я нахожу, как он реализован немного неуверенно, поскольку ВСЕ ваши данные сеанса хранятся непосредственно в cookie сеанса браузера пользователей.)

Вы можете сделать это, как предлагал Residuum, и отступать через библиотеку сессий codeigniter и находить, где он хранится, или вы можете переопределить обработку сеанса с помощью чего-то вроде OB_Session. ( http://bleakview.orgfree.com/obsession/ )

Я бы настоятельно рекомендовал установить либо OB_Session, либо что-то вроде этого, так как он будет использовать собственную обработку сеанса PHP, и он будет держать ваши файлы cookie либо A) слишком большими, либо обрушиваться на ограничение байта браузера, либо B) данные должны храниться на стороне клиента.

Наконец, в зависимости от того, что вы пытаетесь сделать, я буду следовать инструкциям руководства пользователя CI и хранить данные сеанса в базе данных. ( http://codeigniter.com/user_guide/libraries/sessions.html ) Это облегчило бы вам работать с данными и даже обновлять и расширять то, что хранится в Codeigniter. Пожалуйста, имейте в виду, что даже если вы храните его в базе данных, которую STILL необходимо изменить, например, OB_Session, поскольку ваш файл cookie по-прежнему хранит все данные даже при изменении базы данных.

Файл cookie содержит хеш-данные md5 данных сеанса и ключ шифрования файла cookie, который проверяется при загрузке данных, см. System / libraries / Session.php, function sess_read () lines 140ff:

// Decrypt the cookie data if ($this->sess_encrypt_cookie == TRUE) { $session = $this->CI->encrypt->decode($session); } else { // encryption was not used, so we need to check the md5 hash $hash = substr($session, strlen($session)-32); // get last 32 chars $session = substr($session, 0, strlen($session)-32); // Does the md5 hash match? This is to prevent manipulation of session data in userspace if ($hash !== md5($session.$this->encryption_key)) { log_message('error', 'The session cookie data did not match what was expected. This could be a possible hacking attempt.'); $this->sess_destroy(); return FALSE; } } 

Это напрямую не отвечает на ваш вопрос, но я подумал, что это может быть полезно знать.

Для просмотра сеанса PHP используйте следующее.

 print_r ($_SESSION); 

Для просмотра сеанса CI используйте следующее.

 print_r ($this->session->userdata); 

Просто проверил это сегодня с Firebug ..

Чтобы следить за ответом Шани, в файле «application / config / config.php» CodeIgniter, если вы задаете:

 $config['sess_use_database'] = TRUE; 

то только данные сеанса CI по умолчанию: session_id, IP_address .., сохраняется как cookie браузера.

Любые дополнительные пользовательские данные, предоставляемые set_userdata() , такие как имена пользователей и пароли, больше не являются частью файла cookie, а вместо этого хранятся в вашей базе данных.

Когда я говорю о «сеансах» ниже, я имею в виду сеансы CI, а не сеансы PHP.

Если вы используете параметр по умолчанию (который, по словам руководства, не следует использовать для конфиденциальных данных), ответ на ваш вопрос заключается в том, что он не знает. Он доверяет файлу cookie.

Чтобы использовать его в безопасном режиме, вы должны использовать параметр сеанса базы данных, а также параметр шифрования. Используя оба этих варианта, это ответ на ваш вопрос:

В файле cookie хранится только одно значение. Это значение представляет собой сериализованный и зашифрованный массив. Этот массив содержит четыре части информации.

  • 'session_id', => случайный хэш
  • 'ip_address' => 'string – IP-адрес пользователя'
  • 'user_agent' => 'string – данные пользовательского агента'
  • 'last_activity' => метка времени

Идентификатор сеанса – это случайная строка. Это строка, которая используется для корреляции с данными в таблице сеансов. Строка обновляется (и повторно зашифровывается) каждый запрос и обновляется в файле cookie и таблице. Если это не соответствует значению таблицы сеанса, данные таблицы недоступны и будут попадаться во встроенную сборку мусора.

При желании вы также можете обеспечить проверку IP-адресов в классе сеанса CI. Это означает, что в дополнение к случайному регенерирующему идентификатору сеанса они должны также оставаться последовательными, или сеанс будет уничтожен.

При желании вы также можете выполнить проверку UA и значение тайм-аута.

Поэтому традиционный файл сеанса никогда не записывается в папку кэша. Сеансы CI Cookie бесполезны для всех, кроме неличных данных, таких как запоминание состояний пользовательского интерфейса веб-интерфейса. Сессии базы данных CI очень гибкие. Если ваша PHP-установка включает Mcrypt, безопасность также надежна. Если у вас нет Mcrypt, они по-прежнему достаточно безопасны, но не будут проходить, например, с соблюдением PCI.

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