This repository has been archived on 2024-04-08. You can view files and clone it, but cannot push or open issues or pull requests.
khosb/includes/kohana/modules/userguide/guide/ru-ru/using.sessions.md

224 lines
13 KiB
Markdown
Raw Normal View History

2010-08-21 04:43:03 +00:00
# Сессии и Куки
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
: данные сессии, хранимые в виде сериализованной и (необязательно) зашифрованной строки