Сессии и Cookie в PHP используются для сохранения временной информации которая доступна в других скриптах других файлах. Нужно понимать разницу между Session и Cookie, т.к. они выполняет как бы ту же функцию по хранению временных данных, но применять их стоит в зависимости от задачи. Стоит учесть один нюанс, cookie могут работать сами по себе (если, конечно, пользователь не отключил поддержку cookie в браузере). Сессии не могут работать без cookie, т.к. для сессии создается своя cookie где хранится SESSION_ID пользователя.
Где можно использовать Cookie?
- В партнерских программах для хранения идентификатора пригласителя в браузер реферала.
- Хранить выбор пользователя по поводу дизайна сайта (выбор цвета, фона) если такая функция по динамичности дизайна есть на сайте
Cookie лучше использовать в скриптах которые не создадут проблем сайту и его пользователям. Пользователь имеет доступ к данным из cookie и он может их редактировать. Никогда не пользуйтесь cookie в хранение важных данных.
Криворукость администраторов и Cookie!
Встретил однажды самописный сайт одного программиста, прошел регистрацию зашел в личный кабинет и стал смотреть функционал. Мне захотелось узнать какие данные сайт хранит у меня в браузере. Открыл браузер Opera, просмотрел cookie для этого домена и улыбнулся. После аутентификации, сайт добавил cookie с названием user и значением 75, где 75 это был мой ID в базе данных. Долго не думая сменил мой ID на ID администратора, его ID был 5.
Обновил страницу и я получил доступ к админке сайта, появились дополнительные пункты в меню (Добавить статью, Пользователи...) вот так обычной подменной значении я получил права администратора на сайте не зная пароля админа.
Ситуация была бы сложнее если бы администратор хранил в cookie user не ID пользователя а хэш вроде md5( sha1($username). ':' . sha1($password) ). В данном случае, мне нужно было знать пароль администратора и алгоритм шифровки чтобы получить доступ к админе, а так мне нужен был только его ID который интуитивно понятно, что он в диапазоне от 1 до 10.
В чем приоритет Session перед Cookie?
Cookie хранятся на стороне пользователя в браузере и он их может редактировать. Сессии это временные файлы на стороне сервера, к ним имеет доступ только системный администратор. Вот именно сессии лучше использовать для хранения данных по авторизации пользователя т.к. пользователь не будет иметь доступ к данным из сессии.
Но, даже в значениях сессии лучше хранить не ID пользователя а его зашифрованный пароль. По части безопасности скриптов есть отдельный раздел на моем блоге, стоит с ним ознакомится.
Применяем сессии в работе
Чтобы сессии начали работать, нужно вызвать их в начале скрипта с помощью функции session_start(); Данная функция создает для пользователя свой уникальный идентификатор который определяет временный файл сессии для каждого пользователя в частности.
<?php session_start(); ?>
напишем небольшой пример, отправим данные из одного скрипта в другой через глобальный массив $_SESSION. Посмотрим небольшой скрипт аутентификации.
Файл: login.php
<?php session_start(); $auth = True; if($auth != True) { echo 'Логин или пароль введен неправильно!'; } else { // Логин пользователя $_SESSION['username'] = 'RedRabbit'; // Дата и время последнего входа $_SESSION['auth_datetime'] = date('Y-m-d H:i:s'); } ?>
Данные уже сохранились в наши сессии, теперь они доступны в других участках нашего сайта. Создаем новый файл user.php и там проверяем если пользователь прошел авторизацию и выводим дату последнего входа.
Файл: user.php
<?php start_session(); // Проверяем если значение клюдча username в массиве $_SESSION не является пустой if(isset($_SESSION['username']) and !empty($_SESSION['username'])) { echo 'Здравствуйте, ' . $_SESSION['username']; echo '<br>'; echo 'Ваш последний вход на сайт: ' . $_SESSION['auth_datetime']; } ?>
Результат работы
Здравствуйте, RedRabbit Ваш последний вход на сайт: 2013-04-22 21:02:58
Сессии имеют фиксированный срок жизни, его можно редактировать в php.ini чтобы увеличить их срок жизни нужно редактировать следующие переменные (время указывается в секундах).
session.gc_maxlifetime = 10800 session.cookie_lifetime = 10800