сессии в php

Php: основы использования – manual

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

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

По умолчанию PHP использует внутренний обработчик files
для сохранения сессий, который установлен в INI-переменной session.save_handler.
Этот обработчик сохраняет данные на сервере в директории, указанной в конфигурационной
директиве session.save_path.

Сессии могут запускаться вручную с помощью функции session_start().
Если директива session.auto_start установлена
в 1, сессия автоматически запустится, в начале запроса.

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

Замечание:

Сессии, использующие файлы (по умолчанию в PHP), блокируют файл сессии
сразу при открытии сессии функцией session_start() или
косвенно при указании session.auto_start.
После блокировки, ни один другой скрипт не может получить доступ к этому же файлу
сессии, пока он не будет закрыт или при завершении скрипта или при вызове функции
session_write_close().

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

Похожее:  Система Мой Киевстар - регистрация, управление услугами, смена тарифного плана

Обработка входа с сессиями и файлами «куки» (cookie)

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

  1. Пользователь открывает страницу входа на веб-сайт.
  2. После отправки формы входа, сервер, на другом конце, аутентифицирует запрос, проверив введённые учётные данные.
  3. Если учётные данные, введённые пользователем, верны, сервер создаёт новый сеанс. Сервер генерирует уникальное случайное число, которое называется идентификатором сеанса. Также, на сервере, создаётся новый файл, который используется для хранения информации, относящейся к сеансу.
  4. Затем, идентификатор сеанса передаётся обратно пользователю, вместе с тем, что он запросил. За кулисами этот идентификатор сеанса отправляется в заголовке ответа «куки» PHPSESSID (так называется по умолчанию).
  5. Когда браузер получает ответ от сервера, он получает заголовок куки-файла PHPSESSID. Если в браузере разрешены «куки», то он сохранит этот PHPSESSID, в котором хранится идентификатор сеанса, переданный сервером.
  6. Для последующих запросов, «кука» PHPSESSID передаётся обратно на сервер. Когда сервер получает «куку» PHPSESSID, он пытается инициализировать сеанс с этим идентификатором сеанса.  Он делает это, загружая файл сеанса, который был создан ранее во время инициализации сеанса. Затем он инициализирует суперглобальную переменную массива $_SESSION с данными, хранящимися в файле сеанса.

Таким образом, пользовательские данные сохраняются даже в нескольких запросах, и пользователь не теряется на протяжении всего сеанса.

Безопасность

Итак, мы умеем передавать идентификатор от одной
страницы (PHP-скрипта) к другой (до следующего вызова с нашего
сайта), а значит мы можем различать всех посетителей сайта. Так как
идентификатор сессии – это очень большое число (128 бит), шансов,
что его удастся подобрать перебором, практически нет. Поэтому
злоумышленнику остаются следующие возможности:

  • на компьютере пользователя стоит “троян”, который ворует номера сессий;
  • злоумышленник отлавливает трафик между компьютером пользователя и сервером.
    Конечно, есть защищенный (зашифрованный) протокол SSL, но им пользуются не все;
  • к компьютеру нашего пользователя подошел сосед и стащил номер сессии.

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

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

Итак, в нашей программе явно видны две “дыры”, одна
маленькая и не особо заметная, а вот вторая – просто огромная, через
которую большинство хакеров и лезет туда, куда не надо.

Как “залатать” дыру номер 1?

Не будем писать тонны кода по блокировке IP-адреса
и т.п., а просто проверим, откуда приходит запрос, а точнее с какой
страницы пришёл запрос, если это будет любая страница с нашего
сайта, то всё нормально, а во всех остальных случаях пускать не
будем. Подкорректируем файл authorize.php:

authorize.php V2

Выбираем правильное хэширование


Идею хранения паролей нашли, то есть хранения не паролей, а их хэшей. А вот какой алгоритм хэширования выбрать?

Давайте посмотрим на то, что пробовали выше – простая функция md5. Алгоритма его расшифровки нет, но тем не менее md5 не рекомендуется для использования. Почему?

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

    select password from passwords where hash='e10adc3949ba59abbe56e057f20f883e';

Конечно, вы сами не будете использовать пароль 123456, но как насчет ваших пользователей? Да, 123456 можно подобрать и руками, но в таком случае никакие алгоритмы не помогут.
Наша же задача максимально позаботиться о юзерах, которые выбирают пароли сложнее qwerty. Думаем дальше, гуглим.

Помимо md5 есть множество алгоритмов хэширования, sha256, sha512 и еще целая толпа. Их сложность выше, но это не отменяет опять-таки существования таблиц с готовыми паролями.
Нужно что-то хитрее.

Автоматический запуск сеанса

При необходимости применения сессий в приложении, есть возможность запускать сеанс автоматически без использования функции session_start.

В файле php.ini есть параметр session.auto_start, который позволяет запускать сеанс автоматически для каждого запроса. По умолчанию установлено значение 0 (выкл), и вы можете установить его на 1 (вкл), чтобы включить функцию автоматического запуска.

С другой стороны, если у вас нет доступа к файлу php.ini, и вы используете веб-сервер Apache, эту переменную можно задать с помощью файла .htaccess.

Если вы добавите строку выше в ваш .htaccess файл, то это должно автоматически запускать сессии в вашем PHP-приложении.

Как уничтожить сессию

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

Попробуем понять, как это работает в следующем примере.

Функция session_destroy удаляет всё, что хранится в текущем сеансе. Таким образом, с последующими запросами вы увидите пустую переменную $_SESSION, поскольку данные сеанса, хранящиеся на диске, были удалены функцией session_destroy.

Как правило, функцию session_destroy нужно использовать, когда пользователь выходит из системы.

Как обойтись без шифрования. хэширование

Фокус в том, что не нужно хранить пароли в открытом виде, но и не нужно шифровать их с возможностью расшифровки. Пароли нужно хэшировать и в базе хранить не пароль, а его хэш.
Хитрым образом закодированную строку, которую нельзя расшифровать. Например, не password, а 5f4dcc3b5aa765d61d8327deb882cf99

Вы можете спросить, что это за хрень и как же сравнить пароль, введенный пользователем, с паролем, лежащим в базе. А нам и не нужно сравнивать пароли – достаточно сравнить их хэши.

Например, есть простая функция хэширования md5. Вот так она работает

Заглушка для авторизации

Функции, связанные с авторизацией, будут лежать в отдельном файле и своем пространстве имен. Создадим файл auth.php в api/v1/common – там, где уже лежит helpers.php.
Если вы разбирали уроки админки, особенно третий, про серверную часть, то эти пути вам будут знакомы. Если у вас свой проект, то кладите auth.php куда удобно.
Главное, потом правильно указать пути.


Содержимое auth.php

Создание переменных сеанса

В этом разделе мы изучим, как инициализировать переменные сессии в PHP.

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

Давайте рассмотрим следующий пример кода, который показывает, как инициализировать переменные сеанса.

Заключение

В этой статье мы изучили основы обработки сеансов в PHP. Это ключевая концепция, которая позволит вам сохранять информацию для веб-страниц.

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

Использование функции session_start

Метод, в котором сессия запускается функцией session_start, вы будете видеть часто.

Важно, чтобы функция session_start вызывалась в начале скрипта, перед отправкой чего-либо браузеру. В противном случае, вы столкнётесь с печально известной ошибкой Headers are already sent.

Вместо заключения

Проблемы с dev режимом во vue – это неприятный момент. Мы хотим и апишечку подергать, и все удобства vue-cli использовать. И на елку влезть, и ничего не ободрать.
Возможно, есть более изящный способ обойти эти проблемы в dev режиме, но я их пока не нашел. Поэтому приходится подпирать код лишними условиями.

Авторизация пользователя

Вопросы по авторизации пользователей с помощью PHP-сессий постоянно задаются в конференциях по
web-программированию. Механизм авторизации пользователей в системе с помощью сессий довольно хорош
с точки зрения безопасности (см.раздел Безопасность).

Проверяем работоспособность vue

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

Но попробуем пересобрать админку, чтобы убедиться, что все хорошо. Сначала в production режиме

    npm run build

Сессии и автоматический вход

Разработчики НЕ ДОЛЖНЫ использовать долгоживущие сессии для реализации
автоматического входа в систему, потому что это резко повышает вероятность
кражи сессии. Автоматический вход в систему должен реализовываться
разработчиком самостоятельно.

Как получить идентификатор сеанса

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

Как запустить сессию

В этом разделе мы обсудим, как запустить сессию в PHP.

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

Как изменять и удалять переменные сеанса

Можно изменять или удалять переменные сеанса, созданные ранее в приложении так же, как обычные переменные PHP.

Давайте посмотрим, как изменять переменные сессии.

Неадаптивное управление сессиями


В настоящее время PHP использует адаптивное управление сессиями по умолчанию.
Адаптивное управление сессиями несёт дополнительные риски.

Что делать дальше?

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

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

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