Как CodeIgniter узнает, что cookie содержит действительные данные сеанса? - PullRequest
20 голосов
/ 01 февраля 2010

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

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

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

Ответы [ 5 ]

10 голосов
/ 02 февраля 2010

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

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

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

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

5 голосов
/ 02 февраля 2010

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

Используйте следующую команду, чтобы увидеть сеанс PHP.

print_r ($_SESSION);

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

print_r ($this->session->userdata);
5 голосов
/ 01 февраля 2010

Файл cookie содержит хэш md5 данных сеанса и ключ шифрования файла cookie, который проверяется при загрузке данных, см. System / library / Session.php, функция sess_read (), строки 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;
   }
}
3 голосов
/ 11 ноября 2011

Только что проверил это сегодня с Firebug ..

Чтобы проконтролировать ответ Шейни, в файле CodeIgniter «application / config / config.php», если установлено:

$config['sess_use_database'] = TRUE;

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

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

0 голосов
/ 18 февраля 2013

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

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

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

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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...