Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

Утилита 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 по-прежнему содержит все данные, даже если он изменен на базу данных.

Ответ 2

Файл cookie содержит хеш-данные сеанса и ключ шифрования файла 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;
   }
}

Ответ 3

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

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

print_r ($_SESSION);

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

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

Ответ 4

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

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

$config['sess_use_database'] = TRUE;

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

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

Ответ 5

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

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

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

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

  • 'session_id', = > random hash
  • 'ip_address' = > 'строка - IP-адрес пользователя
  • 'user_agent' = > 'string - данные пользовательского агента'
  • 'last_activity' = > timestamp

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

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

Кроме того, вы также можете обеспечить проверку UA и значение тайм-аута.

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

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