Что такое Cookies, для начинающих

куки

От автора:В этой статье мы рассмотрим что такое cookies (куки) и с чем его едят :) . Т.к. протокол HTTP не поддерживает сохранение данных между двумя разными транзакциями, были придуманы сессии и cookies. Это очень упрощает работу, как программистам, так и пользователям. Первым дает возможность хранить данные о пользователе, другим хорошо за счет того, что теперь им не нужно каждый раз заново вводить данные о себе (email, логин, icq и т.д.) и что-то этому подобное…

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


Перед изучением урока «Что такое cookies?», я рекомендую скачать исходник себе на компьютер!

Для начала поговорим о куках, как, грубо говоря, разновидности сессии.

Определение

Определим, что Cookies — это текстовые строки, хранящиеся на стороне клиента, и содержащие пары «имя-значение», с которыми связан URL, по которому браузер определяет, нужно ли посылать cookies на сервер.

Установка

Устанавливать очень просто, всего лишь единственной функцией – setcookie

Синтаксис setcookie:

bool setcookie (string name, string value, int expire, string path, string domain, int secure);

Где:

Name – имя устанавливаемого cookie

Value – значение сохраняемого cookie с именем name

Expire – время жизни cookie

Path – путь, по которому доступен cookie

Domain – домен, из которого доступен cookie

Secure — директива, определяющая, доступен ли cookie не по запросу HTPPS. По умолчанию эта директива имеет значение 0, что означает возможность доступа к cookie по обычному запросу HTTP.

Пример использования cookies

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

<?php
/*Блок 1*/
    if($_COOKIE['views']){
        $views = $_COOKIE['views'];
        ++$views;
        if(!setcookie('views', $views,time()+60*60*24)){
            echo "Включите у себя в браузере поддержку cookies";
        }
        echo "Вы посетили эту страницу $views ";
/*Конец Блока 1*/

/*Блок 2*/
    }else{
        $views = 1;
        if(!setcookie('views', $views,time()+60*60*24)){
            echo "Включите у себя в браузере поддержку cookies";
        }
        echo "Вы посетили эту страницу $views ";

    }
/*Конец Блока 2*/
?>

Я обновил страницу 12 раз и в cookie с именем views записалось значение «12».

куки

Далее мы просто проверим, как записанный cookie отображается в настройках браузера. Например, в Google Chrome.

куки

куки

куки

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


Блок 1

Если существует такая СУПЕРГЛОБАЛЬНАЯ переменная $_COOKIE[‘views’] с именем ‘views’, то мы просто присвоим её значение переменной $views и преинкрементируем её (++$views; тождественен Sviews= $views +1;). Далее снова идет условие: если невозможно записать cookie в браузере клиента, то вывести сообщение, чтобы он разрешил записывать cookies.

Конец 1-го блока

/***вставка***/

setcookie(‘views’, $views) – php функция записи cookie в браузер клиента. Где ‘views‘ – это имя cookie, а $views – это переменная, которая содержит значение записываемого cookie.

/***вставка***/

Блок 2

Если же $_COOKIE['views']) не существует, то вместо операций $views = $_COOKIE['views']; ++$views; мы присвоим переменной $views единицу. $views=1; А остальное такое же как и в первом блоке.

Конец 2-го блока


Если же $_COOKIE['views']) не существует, то вместо операций $views = $_COOKIE['views']; ++$views; мы присвоим переменной $views единицу. $views=1; А остальное такое же как и в первом блоке.

Время жизни cookies

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

Установить можно его несколькими способами. Всего их два, может, кто больше знает, но я использую именно эти два. Первый – это задавать срок жизни при помощи встроенной php функции time(), второй – усовершенствованный вариант mktime().

time() позволяет переводить текущее время в секунды с начала эпохи, это где-то в 1975 году началось.

mktime() позволяет переводить любое понятное нам время (типа 20-01-2010 17:45:08) в секунду с начала эпохи.

Синтаксис:

int mktime ([int hour, int minute, int second, int month, int day, int year, int is_dst)

Где hour, minute, second, month, day, year – это соответственно часы, минуты, секунды, месяцы, дни, годы. Допустим, мы хотим отобразить время в секундах такой даты - 29 января 2000 года 17 часов 30 минут. Это будет выглядеть так:

echo mktime(17,30,0,1,29,2000);

Давайте теперь немного видоизменим наш самый первый код, то есть продлим жизнь нашей cookie на день вперед.

Результат:

 setcookie('views', $views,time()+60*60*24) 

куки

Удаление cookie

Это просто:

 setcookie('views’) 

Защита cookie

Ниже приведен список способов защиты cookies, которые желательно применять комплексно.

Например, можно открывать доступ только из определенного каталога и страницы

Шифровать данные

Список доменов, которые имеют доступ к cookies

Доступ только из определенного каталога и страницы

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

Рассмотрим этот способ на примере. В корневом каталоге сайта создадим любой каталог. Я, например, создал каталог под именем web и закинул ранее созданный нами файл index.php, код которого изображен в самом начале нашей статьи, но только с одним изменением. Я изменил название старого cookie на viewsweb. То есть новый cookie будет иметь вид $_COOKIE[‘viewsweb’];

Только теперь в новом файле index.php, что находится в директории web вместо:

 setcookie('views', $views,time()+60*60*24) 

Нужно будет переписать на это:

 setcookie('viewsweb', $views,time()+60*60*24,'web/index.php') 

где 'web/index.php' означает, что доступ к этому куки можно получить только из страницы http://sessionsandcookies.gromitsu/web/

Код web/index.php:

<?php

    if($_COOKIE['viewsweb']){
        $views = $_COOKIE['viewsweb'];
        ++$views;
        if(!setcookie('viewsweb', $views,time()+60*60*24,'web/index.php')){
            echo "Включите у себя в браузере поддержку cookies";
        }
        echo "Вы посетили эту страницу $views ";
    }else{
        $views = 1;
        if(!setcookie('viewsweb', $views,time()+60*60*24,'web/index.php')){
            echo "Включите у себя в браузере поддержку cookies";
        }
        echo "Вы посетили эту страницу $views ";

    }
?>

А теперь для наглядности создадим еще один файл test.php в корне сайта с таким вот кодом:

<?php

echo 'Cookies from http://sessionsandcookies.gromitsu/web/ viewsweb = '.$_COOKIE['viewsweb'];
echo '<br><br>';
echo 'Cookies from http://sessionsandcookies.gromitsu/ viewsweb = '.$_COOKIE['views'];

?>

Пример в картинках

куки

куки

Доступ через домен

Практически то же самое, что и в примере выше, только setcookie будет иметь такой вид:

 
setcookie('viewsweb', $views,time()+60*60*24,'web/index.php','.sessionsandcookies.gromitsu') 

При таком ограничении домен может принимать формы mysessionsandcookies.gromitsu или
your.sessionsandcookies.gromitsu.

Шифрование данных

На эту часть нашего замечательного урока можно написать отдельную статью. Так что здесь мы просто пробежимся галопом по Европам. Смотрим код:

<?
// задаем вектор
$vector = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_CAST_256, MCRYPT_MODE_CFB), MCRYPT_RAND); //создаёт вектор инициализации (IV) из произвольного источника
$key = "qwertyaa778866zn343"; // ключ для расшифрования(шифрования) (любой на ваше усмотрение)
$views = 100; //значение будушего куки
$shyfr = mcrypt_encrypt(MCRYPT_CAST_256, $key, $views, MCRYPT_MODE_CFB, $vector); // производится шифрование при помощи вектора инициализации и ключа шифрования
setcookie("viewsdecoded", $shyfr, "/decoding.php"); // запись кука
echo"<br> this is enscrypted viewsdecoded = $shyfr <br>";
?>

Расшифровка

<?
// вектор остается неизменным
$vector = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_CAST_256, MCRYPT_MODE_CFB), MCRYPT_RAND); // //создаёт вектор инициализации (IV) из произвольного источника
$shyfr2 = $_COOKIE['viewsdecoded']; //значение шифрованного кука
$key = "qwertyaa778866zn343"; // ключ для расшифрования(шифрования) (любой на ваше усмотрение)
$decrypt_name = mcrypt_decrypt(MCRYPT_CAST_256, $key, $shyfr2, MCRYPT_MODE_CFB, $vector);// производится расшифрование при помощи вектора инициализации и ключа расшифрования
echo"<br> this is enscrypted viewsdecoded = $shyfr2 <br>";
?>

Заключение

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

Если вы уже добрались до этого места, то вы разобрались с основными принципами работы с cookies, и можете уже применять их на практике.

Куки применяются практически везде, где нужно сохранять данные между транзакциями (запросами на посещение страниц). Это например сохранение данных при авторизации (за вас автоматически вводятся пароль и логин, естественно пароль хорошо зашифрован), или, например, в интернет-магазинах (сохранение товаров, которые вы положили в корзину, даже если вы закрыли браузер и вернулись, например, где-то в течении часа, то корзина ещё не опустела).

На этом, урок что такое куки и с чем его едят для начинающих, завершен.

Автор: Влад Паук

Редакция: Рог Виктор и Андрей Бернацкий. Команда webformyself.

E-mail: contact@webformyself.com

Проект webformyself.com - Как создать свой сайт. Основы самостоятельного сайтостроения

"Киберсант-вебмастер" - самый полный курс по сайтостроению в рунете!

P.S. Хотите опубликовать интересный тематический материал и заработать? Если ответ «Да», то жмите сюда.

Хотите узнать, что необходимо для создания сайта?

Посмотрите 3-х минутное видео и у Вас будет четкий пошаговый план по созданию сайта с нуля!

Смотреть видео

Метки: , , ,

Комментарии Вконтакте:

Комментарии Facebook:

Комментарии (23)

  1. Юрий Рузаев

    Влад, ты действительно постарался на славу! В литературе, которую я до этого изучал, подобное описано немного скуповато и сжато, и некоторые моменты понимались с трудом. У тебя же все предельно ясно и думаю, со мной согласится любой. Благодарю за умный материал! Большое спасибо, Виктору и Андрею за предоставляемую мне поистине ценную информацию! С уважением, Юрий.

  2. дядя Валера, эсквайр

    Влад, я видимо шибко сильный Чайник — мне таки не удалось понять почти ничего: браузеры Google Chrom u Mozilla FireFox и так без проблем навечно запоминают логины и пароли…

  3. Валентин

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

  4. Виктор Старченков

    Благодарен Богу, что подписался на рассылку Виктора Рога и Андрея Бернацкого, благодаря которым я получил этот урок Влада.
    И что то не верится, что ты самоучка, Влад, хотя это и не принципиально. Спасибо за урок. С первого прочтения пока не всё понятно, но буду изучать с применением исходника. Ущё раз спасибо!

  5. Евгений Банин

    Вобщем, довольно понятно даже для не посвященного в тему.
    Изучаю курс с первого урока.
    Вопросы, конечно появляются, но стараюсь разобраться.
    Спасибо!
    Ждем новых уроков!

    Все на устранение компьютерной безграмотности!

  6. Alex

    time() позволяет переводить текущее время в секунды с начала эпохи, это где-то в 1975 году началось.

    Не где-то, а эта дата точно известна: 00:00:00 01-01-1970 GMT

  7. Даврон

    Привет из Ташкента! Спасибо. Было очень интересно и полезно для новичков.

  8. Валентина

    Хвалу уроку воздают явно не «новички»! Я не говорю, что урок плох, просто он обращен к знающим людям, понимающим терминологию. Для нас, новичков, нужно расписывать «пошаговые» действия.
    Возьмем, к примеру, первый блок: «Если существует такая СУПЕРГЛОБАЛЬНАЯ переменная $_COOKIE[‘views’] с именем ‘views’, то мы просто присвоим её значение переменной $views и преинкрементируем её (++$views; тождественен Sviews= $views +1;). Далее снова идет условие: если невозможно записать cookie в браузере клиента, то вывести сообщение, чтобы он разрешил записывать cookies».
    Вы полагаете, что всё это понятно новичку? Здесь из доступных для понимания новичка слов — лишь служебные: если, её, такая, с, то, чтобы …
    Не надо,господа специалисты, держать «пальцы веером». В своей профессии мы тоже не из последних.
    С уважением к Вашему интеллекту — Валентина

    • Never Lex

      Валентина. Каждый урок имеет свою степень сложности. Если вы вообще не понимаете, что такое PHP, то данный урок смотреть вам рано. Разберитесь для начала с основными понятиями.

  9. Хамид

    Спасибо за урок,я еще с первыми разбираюсь и вникаю.

  10. nina

    Да, Валентина, права. Текст ни для каких не новичков и даже не для чайников. Я вот с высшим образованием ( не купленным как сейчас), но образование-то гуманитарное. И то, что Вы написали – для меня просто абракадабра. Если Вы и в самом деле хотите научить того, кто ничего не понимает в этих терминах — то пишите человеческим языком. С ув. Нина

  11. Света Панова

    Действительно, очень трудно понять что либо без предварительной подготовки, а хотелось бы знать больше.

  12. Сергей

    Спасибо, постараюсь изучить. Время есть.

  13. Ольга

    Спасибо, ценная информация и объясняется понятно!

  14. Андрей

    Спасибо, давно ищу подобную информацию.

  15. Нечокнутый профессор

    В первом примере условие «Включите у себя в браузере поддержку cookies» не срабатывает после отключения куков, а выдает «Вы посетили эту страницу 1 раз»
    Я сделал так:

    • Нечокнутый профессор

      if($_COOKIE['views']){
      $views = $_COOKIE['views'];
      $views++;
      setcookie(‘views’, $views,time()+60*60*24);
      echo «Вы посетили эту страницу $views раз»;
      }
      elseif (!$_COOKIE['views']){
      echo «Включите у себя в браузере поддержку cookies»;
      }

  16. Vladimir

    «Без комментариев»!

  17. Иола

    Ага…Именно это и используется для несанкционированного доступа к вашей личной информации… Я предпочитаю регулярно чистить куки.

  18. Наталия

    Статья далеко не для новичков

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Я не робот.

Spam Protection by WP-SpamFree