Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. PHP

Введение в Cookies

by
Difficulty:BeginnerLength:LongLanguages:

Russian (Pусский) translation by Anna Goorikova (you can also view the original English article)

Возможно, вы слышали о cookie-файлах, но что именно они такое и что мы можем на самом деле делать с ними? В этом руководстве мы сосредоточимся на основах файлов cookie и узнаем об их функциональности в различных веб-приложениях и сайтах. Мы также узнаем, как использовать их в наших проектах PHP и JavaScript, уделяя при этом особое внимание вопросам безопасности, которые могут возникнуть при их использовании. Прочитав это, вы приобретете необходимый набор навыков для безопасного внедрения файлов cookie в ваши собственные веб-приложения.


Шаг 1. Понимание файлов cookie

Первый шаг в нашем путешествии - узнать, что на самом деле представляют собой эти файлы cookie! Даже если вы уже работали с ними, вы все равно можете найти эту часть весьма полезной - так что оставайтесь со мной!

Абстрактно

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

  • Веб-серверы могут получать доступ только к файлам cookie, которые настроены для их собственного домена. Этот домен устанавливается браузером, когда веб-сервер запрашивает новый файл cookie, и может быть только доменом или поддоменом веб-сервера (веб-сервер может выбрать поддомен, если он этого хочет). Это означает, что файлы cookie, которые были установлены, например, google.com, не могут быть прочитаны mozilla.com, и наоборот.
  • Согласно протоколу HTTP, размер файлов cookie не может превышать 4096 байт (4 КБ) каждый.
  • Существует ограничение на количество файлов cookie на домен. Количество зависит от браузера, однако обычно используется ограничение в двадцать файлов cookie. Это сделано для того, чтобы один домен не занимал место на диске клиента.
  • Существует ограничение на общее количество файлов cookie на жестком диске клиента. Это число также отличается для каждого браузера, но обычно оно ограничено тремя сотнями файлов cookie. Когда это число превышено, старый файл куки удаляется перед созданием нового.

Куки имеют срок годности. Эта дата установлена, чтобы браузер мог удалять старые куки, когда они больше не нужны веб-серверу. Если срок годности пуст, cookie будет удален при закрытии соединения с сервером. Это происходит, когда пользователь закрывает окно или вкладку сайта или когда пользователь закрывает весь браузер. Эти куки, иногда называемые сеансовыми куки, в основном используются для хранения временных настроек.

Техническая сторона

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

Теперь не пугайтесь, это все очень понятно!

  • Set-Cookie: позволяет браузеру узнать, что сервер хочет создать новый cookie.
  • Имя - это имя файла cookie. Каждый файл cookie в домене должен иметь свое имя, поэтому браузер может хранить все файлы cookie отдельно. После имени следует =content data, где "content data" - это данные, которые должны содержаться в файле cookie. Эти данные могут быть текстовой строкой или числом и, как сказано ранее, могут быть размером до 4 КБ.
  • expires= - это команда для даты истечения срока действия. Дата окончания срока действия указана в формате «Wdy, DD-Mon-YYYY HH:MM:SS GMT» (не спрашивайте меня, почему он был определен для этого смешного формата, потому что я тоже не знаю. Никто из пользователей не видит дату истечения срока действия, так зачем тратить память, пространство на жестком диске и пропускную способность на длинные даты?). Не беспокойтесь об этом, потому что большинство языков программирования имеют простые в использовании функции, доступные вам. Браузер автоматически удаляет куки с датой истечения в прошлом.
  • domain и path требуют более глубокого объяснения. domain - это домен, в котором cookie будет активен. Если доменом является "ads.google.com", файл cookie будет отправляться только на сервер этого домена, а если доменом является "google.com", файл cookie будет отправляться на любой сервер любого из поддоменов домена Google, включая сам google.com.
  • path - это путь домена, в который отправляется файл cookie. Это означает, что если для пути задано значение "/images/", а для домена задано "ads.google.com", файл cookie будет отправляться на сервер только в том случае, если браузер запрашивает файл у "ads.google.com/images/". Если для пути задано значение "/", файл cookie будет отправлен на сервер независимо от местоположения запрошенного файла на сервере.

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


Шаг 2. Как создавать и читать файлы cookie

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

PHP

При создании cookie в PHP важно помнить, что вы должны установить все cookie, прежде чем отправлять какие-либо данные в браузер. Это означает, что вы должны всегда инициализировать новые куки перед любым выводом. Это включает в себя команды echo() или print() и теги <html> или <body>. Конечно, есть некоторые исключения, но это общее правило.

Это должно показаться знакомым, за исключением $secure и $httponly. "secure" используется для того, чтобы файл cookie передавался только в том случае, если установлено соединение HTTPS, если установлено значение «true», и обычно оно должно быть установлено на «false». «httponly» делает куки доступными только по протоколу HTTP, а это означает, что клиентские языки, такие как JavaScript и VBscript, не могут получить доступ к кукам. Это помогает предотвратить неприятные вещи, такие как межсайтовый скриптинг, и должно быть установлено в true, если у вас нет намерений редактировать клиентские куки таким языком, как JavaScript. Кроме того, чтобы предотвратить недопонимание надо заметить, что «httponly» не означает, что куки не могут быть отправлены через HTTPS, на самом деле это возможно. Тем не менее, обратите внимание, что приведенный выше фрагмент кода может быть значительно меньше (и должен быть):

Отлично! Теперь мы можем создавать cookie-файлы, но мы также должны их читать. К счастью для нас, PHP делает это очень легко, когда cookie уже создан. В PHP есть переменная окружения $_COOKIE[], которую можно использовать для извлечения значения cookie. Чтобы использовать ее, просто вставьте имя куки в скобки [] примерно так:

Эта переменная окружения может использоваться как любая другая. Точно так же, как $_GET[] и $_POST[], она может обрабатываться напрямую как обычная переменная (если вы проверили, действительно ли cookie существует).

Если вы хотите изменить дату истечения срока действия, путь или домен, вы должны перезаписать существующий файл cookie с помощью setcookie(), используя то же имя, что и исходный файл cookie. Если вы измените дату истечения срока на прошедшую (например, time()-30*60), cookie будет удален.

JavaScript

Файлы cookie могут быть прочитаны и написаны на стороне клиента. Несмотря на то, что JavaScript не предлагает хорошее решение для чтения и записи файлов cookie, оно возможно и широко используется. JavaScript использует объект document.cookie для манипулирования файлами cookie, как показано в следующем фрагменте:

Как вы могли заметить, этот синтаксис очень похож на нотацию протокола HTTP. Преимущество этого состоит в лучшем контроле, но также создаются некоторые потенциальные проблемы. Ниже приведен <painful> фрагмент для чтения файла cookie.

Я знаю, я знаю; это боль. К счастью для вас, ребята, я публикую ниже некоторые заранее написанные функции (вы можете захотеть создать свои собственные функции для целей обучения, и вам следует сделать это!).

Помните, что эти фрагменты не содержат проверки ошибок.


Шаг 3. Что делать с Cookies

Знаете ли вы? -
Файлы cookie были изобретены Netscape, который хотел использовать их для создания корзины покупок для интернет-магазина. Благодаря cookie-файлам люди могли хранить товары в своей корзине даже после отключения от магазина.

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

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


Шаг 4. Написание классного материала

И наконец! Теперь мы можем начать писать отличный код! Ниже в качестве бонуса приведен фрагмент, который использует куки для создания механизма повторного входа.

"Запомнить меня" в форме входа

Прежде чем мы начнем, этот фрагмент содержит некоторый код MySQL. Если вы не знакомы с MySQL, не паникуйте. Несмотря на то, что этот фрагмент немного сложен, он должен быть понятен с базовыми знаниями PHP и cookie.

Чтобы создать реализацию «запомнить меня», у нас должно быть несколько вещей. Во-первых, нам нужна таблица базы данных, содержащая имя пользователя, пароль и поле идентификации. Во-вторых, нам нужна уникальная строка или номер для безопасной идентификации клиентов с помощью файлов cookie (это идентификация в таблице базы данных). В этом фрагменте в качестве идентификатора мы будем использовать дайджест SHA-1, который является просто строкой. При правильном использовании это обеспечивает превосходную безопасность.

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

При использовании дайджеста, как мы сделали, шансы получить два одинаковых дайджеста ничтожны. Дайджест - это строка из сорока символов, которая, по идее, всегда должна обеспечивать полностью случайный вывод при изменении ввода. На практике вы должны добавить ограничение по времени в коде на стороне сервера, чтобы дайджест не действовал через X минут. Это не позволяет злоумышленникам копировать чьи-то куки и использовать их для входа в систему.


Шаг 5. Лучшие практики

Мы почти достигли конца этого урока. В заключение я хотел бы обобщить некоторые лучшие практики:

  • Никогда не вставляйте конфиденциальные данные в cookie. Клиент может использовать общедоступный компьютер, поэтому не оставляйте личную информацию.
  • Никогда не доверяйте данным, поступающим из куки. Всегда фильтруйте строки и числа! Злоумышленник может записать вредоносные данные в файл cookie, чтобы сделать то, что вы бы не хотели, чтобы ваш сервис делал.
  • Попробуйте оценить, как долго должен быть действителен cookie, и соответственно установить дату истечения срока действия. Вы не хотите загружать компьютер клиента старыми файлами cookie, срок действия которых истекает через сто лет.
  • Всегда устанавливайте secure и httponly для удовлетворения требований вашего приложения. Если ваше приложение не редактирует куки с помощью JavaScript, включите httponly. Если у вас всегда есть HTTPS-соединение, включите secure. Это улучшает целостность и конфиденциальность данных.

Заключение

Я надеюсь, что вы немного узнали из сегодняшнего урока Nettuts+. Если у вас есть какие-либо вопросы, не стесняйтесь оставить комментарий или сказать привет в Twitter.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.