Сессии обеспечивают неразрывность, сохраняя случайный идентификатор, ID сессии, на веб-сервере и на компьютере посетителя (как файл cookie). Веб-сервер использует файл cookie, чтобы определить, что он обменивается информацией с тем же человеком (или, если быть более точным, с тем же компьютером).
cookie хранятся в браузере под названием PHPSESSID и содержат нагромождение букв и цифр. Эта случайная строка является идентификатором сессии (session ID). Соответствующий файл, который содержит то же нагромождение букв и цифр как часть имени, создается и веб-сервере.
Когда сессия инициирована, сервер хранит информацию в переменных, которые могут быть доступны на других страницах, пока сессия остается активной (как правило, до закрытия браузера). Поскольку идентификатор сессии является уникальным для каждого посетителя, никто другой не может увидеть информацию, хранящуюся в переменных сеанса. Это означает, что сессии идеально подходят для аутентификации пользователей, хотя и могут быть использованы в любой ситуации, где необходимо сохранить информацию для одного и того же пользователя при переходе от одной страницы к другой, например, в многостраничных формах или корзине для покупок.
Единственная информация, хранящаяся на компьютере пользователя это cookie, содержащие идентификатор сессии, который сам по себе не имеет смысла. Это означает, что нет никакой опасности раскрытия частной информации, если кто-либо станет изучать содержимое cookie на общем компьютере. Переменные сессии и их значения хранятся на веб-сервере.
Такая система имеет ряд последствий. Содержащий идентификатор сеанса cookie обычно остаются активными, пока браузер не закроется. Поэтому если несколько человек пользуются одним и тем же компьютером, все они имеют доступ к другим сессиям, если только они не закрывают всегда браузер, перед тем как передать его следующему человеку, но такую ситуацию невозможно контролировать. Таким образом, важно обеспечить механизм выхода из системы для удаления как cookie, так и переменных сессии, сохраняя ваш сайт в безопасности. Можно также создать механизм тайм-аута, который автоматически предотвращает любое получение доступа после определенного периода бездействия.
Само по себе хранение переменных сессий в виде обычного текста на веб-сервере не является причиной для беспокойства. Если сервер правильно настроен, файлы сессии не могут быть доступны через браузер. Неактивные файлы также обычно удаляются в PHP (в теории, время жизни 1440 секунд — 24 минуты, но на это нельзя полагаться). Тем не менее, должно быть очевидно, что если злоумышленнику удастся скомпрометировать сервер или захватить сессии, информация может быть раскрыта. Таким образом, хотя сессии достаточно безопасны, для защищенных паролем частей сайта или работы с многостраничными формами не следует использовать переменные сессии, чтобы храненить конфиденциальную информацию, такую как пароли или данные кредитной карты. Пароль (желательно зашифрованный), используемый для получения доступа к защищенному сайту, должен храниться в отдельном месте, а не как переменная сессии.
Сессии поддерживаются по умолчанию, поэтому не требуется никакой специальной конфигурации. Однако сессии не будут работать, если cookie отключены в браузере пользователя. Можно настроить PHP для отправки идентификатора сессии через строку запроса, но это считается риском безопасности.
Создание сессий в PHP
Просто поместите следующую команду на каждой странице PHP, на которой нужно использовать в сессии:
session_start();
Эта команда должна быть вызвана только один раз на каждой странице и до того как сценарий сгенерирует какой-либо вывод, поэтому идеальное положение сразу после открывающего тега PHP. Если какой-либо вывод будет сгенерирован до вызова функции session_start(), команда не выполнится и сессия не будет активирована на данной странице. (См. далее в разделе «Ошибка ‘Headers already sent»)
Создание и уничтожение переменных сессии
Переменная сессии создаётся добавлением её в суперглобальный массив $_SESSION, таким же образом, как и назначение обычной переменной. Скажем, необходимо сохранить имя посетителя и вывести его в приветствии. Если имя передано в форме авторизации как $_POST['name'], его нужно присвоить следующим образом:
$_SESSION['name'] = $_POST['name'];
Теперь переменная $_SESSION['name'] может быть использована в любой странице, которая начинается с session_start(). Поскольку переменные сессии хранятся на сервере, вы должны избавиться от них, как только они больше не требуются сценарию или приложению. Отключите переменную сессии следующим образом:
unset($_SESSION['name']);
Чтобы сбросить все переменные сессии, например, когда вы отключаете пользователя, установите суперглобальный массив $_SESSION в пустой массив следующим образом:
$_SESSION = array();
Не поддавайтесь искушению попробовать unset($_SESSION). Функция работает хорошо, но она слишком эффективна. Это не только очищает текущую сессию, но и предотвращает сохранение любых дополнительных переменных сессии.
Уничтожение сессии
Само по себе отключение всех переменных сессии эффективно предотвращает какое-либо повторное использование информации, но также необходимо сделать cookie сессии недействительными следующим образом:
if (isset($_COOKIE[session_name()])) {
setcookie(session_name(), '', time()-86400, '/');
}
При этом используется функция session_name(), чтобы получить имя сессии динамически, и выполняется сброс cookie сессии в пустую строку со сроком действия, истекшим 24 часа назад (86400 является количеством секунд в сутках). Последений аргумент (‘/’) применяет cookie ко всему домену.
И наконец, уничтожьте сессию с помощью следующей команды:
session_destroy();
При уничтожении сессии таким способом нет риска несанкционированного доступа к ограниченной части сайта или любой информации, которой обмениваются в ходе сессии. Но посетитель может забыть выйти из системы, поэтому не всегда возможно гарантировать, что команда session_destroy( ) сработает, и именно поэтому так важно не хранить конфиденциальную информацию в переменной сессии.
Вы можете встретить функции session_register() и session_unregister() в старых сценариях. Эти функции являются устаревшими. Вместо них используйте $_SESSION['variable_name'] и unset($_SESSION['variable_name']
Регенерация идентификатора сессии
Когда статус пользователя измененяется, например, после входа в систему, рекомендуется в качестве меры безопасности регенерировать идентификатор сессии. Это приводит к изменению случайного набора букв и цифр, которые идентифицируют сессию, но сохраняет всю информацию, хранящуюся в переменных сессии.
Для регенерации идентификатора сессии, просто вызовите session_regenerate_id() и перенаправьте пользователя на другую страницу или перезагрузите эту же.
Ошибка «Headers already sent»
Хотя использовать PHP сессии довольно просто, существует одна проблема, которая ставит в новичков в тупик. Вместо того чтобы все работало так, как вы ожидали, вы увидите следующее сообщение:
Warning: Cannot add header information — headers already sent
Она также затрагивает функции session_start() и setCookie(). В случае с функцией session_start(), решение очень простое: убедитесь, что вы поместили её сразу после открывающего тега PHP (или почти сразу), и проверьте, что перед открывающим тегом нет пробела.
Иногда проблема возникает, даже если перед тегом PHP нет пробелов. Причиной этого, как правило, является программное обеспечение для редактирования, которое вставляет метку порядка следования байтов (BOM) в начале сценария. Если это происходит, откройте настройки редактора сценариев и отключите использование BOM на страницах PHP.
При использовании функции setcookie() для удаления cookie сессии, скорее всего, вы отправили вывод в браузер перед вызовом функции. В этом случае, PHP позволяет сохранять результаты в буфере, используя ob_start(). Затем содержимое буфера отправляется с помощью функции ob_end_flush() после того, как setcookie() выполнит свою работу.
Ограничение сессий во времени
По умолчанию в PHP устанавливается время жизни cookie сессии на компьютере пользователя равным 0, что сохраняет сессию активной, то тех пор пока пользователь не выйдет из системы или не закроет браузер. Таймаут для сессии можно сделать и раньше, через вызов функции ini_set(), которая позволяет изменять некоторые директивы PHP конфигурации на лету. Как только сессия начинается, передайте директиву session.cookie_lifetime в качестве первого аргумента и строку, содержащую число секунд, которое cookie должны оставаться активными, в качестве второго аргумента. Например, ограничить время жизни cookie сессии до десяти минут можно было бы следующим образом:
Leave a comment