224 lines
13 KiB
Markdown
224 lines
13 KiB
Markdown
# Сессии и Куки
|
||
|
||
Kohana предоставляет пару классов, которые облегчают работу с куками и сессиями. На верхнем уровне и сессии, и куки обеспечивают одни и те же функции. Они позволяют разработчику хранить временную или постоянную инфомацию о конкретном клиенте для дальнейшего использования.
|
||
|
||
Куки следует использовать для хранения публичных (некритичных) данных, неизменных в течении длительного времени. Например, хранить идентификатор пользователя или предпочитаемый язык. Используйте класс [Cookie] для установки и получения кук.
|
||
|
||
[!!] Kohana работает с "подписанными" куками. Каждая хранимая кука содержит хэша для предотвращения подмены значения куки. Этот хэш генерируется методом [Cookie::salt], который учитывает свойство [Cookie::$salt]. Вам следует [изменить настройки](using.configuration), когда будете опубликовывать свое приложение.
|
||
|
||
Сессии лучше использовать для хранения временных или секретных данных. Крайне критичную информацию стоит хранить в классе [Session] с драйвером "database" или "native". Когда используется драйвер "cookie", сессия должна быть зашифрована.
|
||
|
||
[!!] Больше информации о работе с переменными сессии Вы можете получить в статье [семь смертных грехов сессий](http://lists.nyphp.org/pipermail/talk/2006-December/020358.html).
|
||
|
||
# Хранение, извлечение и удаление данных
|
||
|
||
[Cookie] и [Session] предоставляют очень схожий API для хранения данных. Главное отличие между ними в том, что доступ к сессии осуществляется как к объекту, а к кукам - как статическому классу (хэлпер).
|
||
|
||
Получить объект сессии можно посредством метода [Session::instance]:
|
||
|
||
// Get the session instance
|
||
$session = Session::instance();
|
||
|
||
Вы можете также получить все данные сессии с помощью метода [Session::as_array]:
|
||
|
||
// Get all of the session data as an array
|
||
$data = $session->as_array();
|
||
|
||
Также есть возможность переписать глобальную переменную `$_SESSION`. чтобы работать с сессиями в более привычном, стандартном для PHP стиле:
|
||
|
||
// Overload $_SESSION with the session data
|
||
$_SESSION =& $session->as_array();
|
||
|
||
// Set session data
|
||
$_SESSION[$key] = $value;
|
||
|
||
## Хранение данных {#setting}
|
||
|
||
Для сохранения данных сессии или куки применяется метод `set`:
|
||
|
||
// Set session data
|
||
$session->set($key, $value);
|
||
|
||
// Set cookie data
|
||
Cookie::set($key, $value);
|
||
|
||
// Store a user id
|
||
$session->set('user_id', 10);
|
||
Cookie::set('user_id', 10);
|
||
|
||
## Получение данных {#getting}
|
||
|
||
Извлечение данных сессии или кук возможно посредством метода `get`:
|
||
|
||
// Get session data
|
||
$data = $session->get($key, $default_value);
|
||
|
||
// Get cookie data
|
||
$data = Cookie::get($key, $default_value);
|
||
|
||
// Get the user id
|
||
$user = $session->get('user_id');
|
||
$user = Cookie::get('user_id');
|
||
|
||
## Удаление данных {#deleting}
|
||
|
||
Метод `delete` позволяет удалить данные из сессии или кук:
|
||
|
||
// Delete session data
|
||
$session->delete($key);
|
||
|
||
// Delete cookie data
|
||
Cookie::delete($key);
|
||
|
||
// Delete the user id
|
||
$session->delete('user_id');
|
||
Cookie::delete('user_id');
|
||
|
||
# Настройка {#configuration}
|
||
|
||
И куки, и сессии имеют несколько параметров, которые влияют на механизм хранение данных. Всегда проверяйте их перед завершением приложения, так как многие из них будут напрямую влиять на безопасность Вашего приложения.
|
||
|
||
## Настройка кук
|
||
|
||
Все настройки изменяются через статические свойства. Вы можете изменить их либо через `bootstrap.php`, либо посредством [расширения классов](using.autoloading#class-extension).
|
||
|
||
Наиболее важный параметр это [Cookie::$salt], он используется для шифрования подписи. Значение необходимо поменять и держать в тайне:
|
||
|
||
Cookie::$salt = 'your secret is safe with me';
|
||
|
||
[!!] Изменение данного значения сделает недействительными все сохраненные ранее куки.
|
||
|
||
По умолчанию куки хранятся до закрытия браузера. Чтобы указать свое значение для времени жизни, измените параметр [Cookie::$expiration]:
|
||
|
||
// Set cookies to expire after 1 week
|
||
Cookie::$expiration = 604800;
|
||
|
||
// Alternative to using raw integers, for better clarity
|
||
Cookie::$expiration = Date::WEEK;
|
||
|
||
Адрес, с которого куки могут быть доступны, может быть ограничен параметром [Cookie::$path].
|
||
|
||
// Allow cookies only when going to /public/*
|
||
Cookie::$path = '/public/';
|
||
|
||
Домен, на котором куки будут доступны, указан в свойстве [Cookie::$domain].
|
||
|
||
// Allow cookies only on the domain www.example.com
|
||
Cookie::$domain = 'www.example.com';
|
||
|
||
Если Вы хотите сделать куку доступной для всех поддоменов, поставьте точку перед началом домена
|
||
|
||
// Allow cookies to be accessed on example.com and *.example.com
|
||
Cookie::$domain = '.example.com';
|
||
|
||
Чтобы разрешить куки только по защищенному (HTTPS) соединению, установите [Cookie::$secure] параметр.
|
||
|
||
// Allow cookies to be accessed only on a secure connection
|
||
Cookie::$secure = TRUE;
|
||
|
||
// Allow cookies to be accessed on any connection
|
||
Cookie::$secure = FALSE;
|
||
|
||
Защитите куки от доступа через Javascript, изменив параметр [Cookie::$httponly].
|
||
|
||
// Make cookies inaccessible to Javascript
|
||
Cookie::$httponly = TRUE;
|
||
|
||
## Драйверы сессии {#adapters}
|
||
|
||
При создании или доступе к объекту класс [Session] Вы можете выбрать, какой драйвер использовать. Доступны следующие драйверы:
|
||
|
||
Native
|
||
: Хранит данные в стандартном месте на диске web-сервера. Путь указывается в параметре [session.save_path](http://php.net/manual/session.configuration.php#ini.session.save-path) файла `php.ini` или переопределяется методом [ini_set](http://php.net/ini_set).
|
||
|
||
Database
|
||
: Хранит информацию в базе данных с помощью класса [Session_Database]. Для работы требуется подключенный модуль [Database].
|
||
|
||
Cookie
|
||
: Хранит данные в куках, с помощью класса [Cookie]. **Для данного драйвера предельный размер сессии будет равен 4Кб **
|
||
|
||
Драйвер по умолчанию может быть установлен в [Session::$default]. Изначально это драйвер "native".
|
||
|
||
[!!] Как и с куками, установка параметра "lifetime" в "0" означает, что сессия будет уничтожена после закрытия браузера.
|
||
|
||
### Настройка драйвера сессии
|
||
|
||
Вы можете применить настройки для каждого драйвера, создав конфигурационный файл `APPPATH/config/session.php`. Следующий пример настроек определяет конфигурацию для каждого драйвера:
|
||
|
||
return array(
|
||
'native' => array(
|
||
'name' => 'session_name',
|
||
'lifetime' => 43200,
|
||
),
|
||
'cookie' => array(
|
||
'name' => 'cookie_name',
|
||
'encrypted' => TRUE,
|
||
'lifetime' => 43200,
|
||
),
|
||
'database' => array(
|
||
'name' => 'cookie_name',
|
||
'encrypted' => TRUE,
|
||
'lifetime' => 43200,
|
||
'group' => 'default',
|
||
'table' => 'table_name',
|
||
'columns' => array(
|
||
'session_id' => 'session_id',
|
||
'last_active' => 'last_active',
|
||
'contents' => 'contents'
|
||
),
|
||
'gc' => 500,
|
||
),
|
||
);
|
||
|
||
#### Драйвер Native {#adapter-native}
|
||
|
||
Тип | Параметр | Описание | По умолчанию
|
||
----------|-----------|---------------------------------------------------|-----------
|
||
`string` | name | имя сессии | `"session"`
|
||
`integer` | lifetime | время жизни сессии (в секундах) | `0`
|
||
|
||
#### Cookie Adapter {#adapter-cookie}
|
||
|
||
Тип | Параметр | Описание | По умолчанию
|
||
----------|-----------|---------------------------------------------------|-----------
|
||
`string` | name | имя куки, используемой для хранения сессии | `"session"`
|
||
`boolean` | encrypted | шифровать данные с помощью [Encrypt]? | `FALSE`
|
||
`integer` | lifetime | время жизни сессии (в секундах) | `0`
|
||
|
||
#### Database Adapter {#adapter-database}
|
||
|
||
Тип | Параметр | Описание | По умолчанию
|
||
----------|-----------|---------------------------------------------------|-----------
|
||
`string` | group | название группы [Database::instance] | `"default"`
|
||
`string` | table | имя таблицы, в которой хранить данные | `"sessions"`
|
||
`array` | columns | ассоциативный массив псевдонимов полей | `array`
|
||
`integer` | gc | дает 1:x шанс, что запустится сборка мусора | `500`
|
||
`string` | name | имя куки, используемой для хранения сессии | `"session"`
|
||
`boolean` | encrypted | шифровать данные с помощью [Encrypt]? | `FALSE`
|
||
`integer` | lifetime | время жизни сессии (в секундах) | `0`
|
||
|
||
##### Структура таблицы
|
||
|
||
Вам придется создать таблицу для хранения сессии в базе данных. Вот структура по умолчанию:
|
||
|
||
CREATE TABLE `sessions` (
|
||
`session_id` VARCHAR(24) NOT NULL,
|
||
`last_active` INT UNSIGNED NOT NULL,
|
||
`contents` TEXT NOT NULL,
|
||
PRIMARY KEY (`session_id`),
|
||
INDEX (`last_active`)
|
||
) ENGINE = MYISAM;
|
||
|
||
##### Поля таблицы
|
||
|
||
Вы можете изменить имя полей, чтобы использовать существующую таблицу. По умолчанию используется имя ключа.
|
||
|
||
session_id
|
||
: название поля "id"
|
||
|
||
last_active
|
||
: метка времени UNIX для последнего времени обновления сессии
|
||
|
||
contents
|
||
: данные сессии, хранимые в виде сериализованной и (необязательно) зашифрованной строки
|