Хелперы Cookie и Encrypt

Комментарии: 18  Просмотры: 14 452

Продолжаем знакомство с Хелперами. И следующие на очереди — это очень нужный и полезный класс Cookie для работы с куками и не менее полезный класс Encrypt для шифрования данных.

Класс Cookie
Использование методов класса Cookie делает работу с кукисами простым и приятным занятием. Вообще кукисы — это излюбленная мишень всяческих хакеров. Но с данным классом этой проблемой уже можно не заморачиваться, так как формирование кукисов здесь происходит не совсем обычно. При их создании используется так называемая «соль» (Salt), которую, перед использованием методов класса, нужно создать, а иначе мы получим ошибку:

Kohana_Exception [ 0 ]: A valid cookie salt is required. Please set Cookie::$salt.

Создается соль в файле bootstrap.php. Для этого пишем над массивом с модулями следующий код (тольцо цифры можете поставить свои):

/**
 * Create cookie salt
 */
Cookie::$salt = '345987456098123';

Теперь у нас есть все для создания куки. Создается она с помощью метода set и принимает три параметра — название куки, ее значение и время жизни в секундах (необязательный параметр):

Cookie::set('user', 'ivan');

Возвращает булево значение — удалось создать куку или нет. Если все прошло удачно, то при выводе содержимого массива $_COOKIE в нем будет следующая информация:

Array ( [user] => 82353c0798cc7f62e557f5bd721792cbfdbbbc70~ivan )

Для получения нормального (расшифрованного) значения массива $_COOKIE используется метод get, который принимает два параметра — название куки и значение по умолчанию, которое вернется, если такой куки не существует.

$user = Cookie::get('user', 'no user');

Этот код вернет нам ivan.
Удаление куки, достаточно трудоемкое в php, здесь выполняется в одну строчку и принимает всего один параметр — название куки:

$user = Cookie::delete('user');

Возвращает булево значение, удачно ли прошло удаление.

Класс Encrypt
Класс Encrypt предназначен для кодирования и последующего декодирования строки. Таким образом мы можем безопасно хранить и получать данные при помощи всего лишь нескольких строк кода. Но перед использованием класса мы должны создать специальный ключ, состоящий из последовательности случайных символов, который будет участвовать в шифровании. Для этого скопируйте файл encrypt.php из папки system/config в папку application/config и добавьте в массив параметр key со случайным значением, чтобы получилось что-то вроде:

return array(
 
	'default' => array(
		/**
		 * The following options must be set:
		 *
		 * string   key     secret passphrase
		 * integer  mode    encryption mode, one of MCRYPT_MODE_*
		 * integer  cipher  encryption cipher, one of the Mcrpyt cipher constants
		 */
		'key'    => 'tralalatrulalatralala',
		'cipher' => MCRYPT_RIJNDAEL_128,
		'mode'   => MCRYPT_MODE_NOFB,
	),
 
);

Подготовительные работы на этом закончены, теперь можно шифровать сам текст, используя метод encode:

$secret_info = 'hello, world';
$secret_info = Encrypt::instance()->encode($secret_info);

Если вывести содержание переменной $secret_info, то мы получим набор символов вида:

7VGX8WF4fDlxQmKYSHgzl2aLh8GuUU1UXweBrQ==

Для их дешифровки используется метод decode:

$secret_info = Encrypt::instance()->decode($secret_info);

Таким образом можно шифровать, например, какие-то секретные текстовые данные и даже при их краже исключается возможность подбора, так как ключ для дешифрации знаем только мы.
На этом все, до встречи в следующем уроке.

<< Назад | Вперед >> | Обсудить на форуме


К записи оставлено 18 коммент.

Очень повеселила фраза «Удаление куки, достаточно трудоемкое в php, здесь выполняется в одну строчку».)
Это что ж такого трудного в том чтоб пустую куку послать?

По уму чтобы удалить куку, нужно выполнить два действия. unset этой куки и потом setcookie с отрицательным expire. Если нужно удалить несколько кук, то это гемор. А тут один простой метод, которому только и надо-название куки. Просто, быстро, компактно.

По стандарту HTTP 1.1 протокола нужно послать пустую куку — и все. Остальное — пережитки прошлого и паранойя.

Если выполнить

setcookie ("test", "", time() - 3600);

или там

setcookie ("test", "");

то кука удалится, но в массиве $_COOKIE['test'] данные еще будут храниться до следующего обновления страницы.
А Cookie::delete(‘test’) удалит подчистую в этот же проход. Что непонятного-то ?

При шифровании строки к примеру в базу данных и после с выводом, где храняться данные? Или работает не по лгике MD5?

Я верно понимаю, что Encrypt можно использовать для хранения паролей в БД по аналогии MD5?
При регистрации пользователя пароль
Encrypt::instance()->encode($secret_info);
При входе пользователя пароль
Encrypt::instance()->decode($secret_info);

Лучше MD5 использовать.

Спасибо за ответ!

Зачем при входе decode? Можно по классике делать, результат введенного пароля при входе шифровать с тем же ключом что и сохраненный пароль а после сверять с шифром, если результаты шифра совпадают то пароль введен верно. Одностороннее шифрование безопаснее.

При использовании шифрования вываливается ошибка, что константа MCRYPT_RIJNDAEL_128 неопределена.
И что странно,ошибку показывает в системной папке SYSPATH\config\encrypt.php, а не в конфиге приложения, хотя конфиг перекинул, ключ указал.

подскажите, где я ошибся

автор даёт уроки относительно своей системы

Для устранения данной ошибки мне, например, для вампа понадобилось включать расширение пхп «php_mcrypt»

Автор дает уроки относительно фреймворка. А если вдаваться в подробности, которые связаны с фреймворком косвенно, то это растянется на 50 лет.

А что будет, если мы не будем создавать свой encrypt.php файл и добавлять в массив параметр key?

Если не будем создавать свой, кохана возьмет файл из папки system. На отсутствие ключа выругается, поэтому добавлять его прийдется. А поскольку в папке system ничего править нежелательно, поэтому мы свой файл и создаем.

Добрый день!
Скажите пожалуйста почему сразу после создания куки нельзя получить его значение, а только после повторного обновления страницы?

Вот код:
$user = Cookie::get(‘user’, null);
if ($user==null)
{
$content = «Куки не существует. Создаю…»;
$cookie_created = Cookie::set(‘user’, ‘Pavel’);
if ($cookie_created)
{
$value = Cookie::get(‘user’, »);
$content .= «Создали куки user со значением «.$value;
}
else
$content = «Не удалось создать куки user»;
}
else
$content = «Существует куки user со значением «.Cookie::get(‘user’, »);

Сначала код возвращает «Куки не существует. Создаю…
Создали куки user со значением».
А после второго клика «Существует куки user со значением Pavel».

Почему так? Ведь если куки уже создан (if ($cookie_created)) код Cookie::get(‘user’, ») должен возратить его значение, но он его не возвращает.

Кука — это файл. Его сначала надо загрузить.

А загрузится он только после обновления страницы?

Ну да. В любом случае — у вас же есть данные. Вы их в куку пишете. Пользуйтесь ими, а после обновления уже из куки берите.



Оставить комментарий или два

Пожалуйста, зарегистрируйтесь для комментирования.