• Php хранение данных в сессии. Сессии в PHP

    //Очистить данные сессии для текущего сценария: $_SESSION = ; //Удалить cookie, соответствующую id: @unset($_COOKIE); //удалить хранилище сессии: session_destroy();

    Чтобы понять, почему обязательно разбивать удаление сессии на 3 этапа, давайте разберёмся, что вообще где существует и куда сохраняется.

    Для наглядности определим все места, где хранятся всевозможные данные о сессии:

    1. Суперглобальный массив $_SESSION .
      Создаётся при старте сессии session_start() . Это только переменная скрипта, которая доступна только на протяжении работы скрипта и НЕ хранится в хранилище на сервере, а хранится в оперативной памяти (а значит исчезает после очередного выполнения скрипта, инициализируясь вновь из хранилища при очередном обращении к серверу).

      У Котерова:

      При завершении сценария PHP автоматически сохраняет массив $_SESSION во временном хранилище, имя которого хранится в SID

      имеется ввиду, что в хранилище записываются данные из массива $_SESSION , если таковые в нём имеются.

    2. Кука SID.
      Создаётся при старте сессии session_start() . Хранит данные о местоположении хранилища данных о сессии данного пользователя. Удаляется только при принудительной чистке куков.
    3. И наконец, Хранилище данных сессии .
      Создаётся при старте сессии вызовом функции session_start(). Хранилище располагается на сервере (там где работает ваш php скрипт).
      В него записываются данные из массива $_SESSION , если они там есть/появляются. Удаляются данные из него только при вызове session_destroy() .
      Данное хранилище продолжает сущелствовать на сервере даже после того, как очередной запрос от пользователя получил ответ, т.е. скрипт завершил свою работу.

    Т.е. можно сказать, что:

    • В php-скрипте работать с данными сессии можно через массив $_SESSION
    • $_SESSION является "маской" для хранилища сессии и хотя запись в этот массив приводит к записи в хранилище, удаление массива само по себе не уничтожает данные в хранилище.
    • удалив массив, вы потеряете доступ к данным сессии только в текущем вызове скрипта, но в следующем он будет вновь иницилизирован (восстанет из пепла), если дополнительно не очистить хранилище.

    Таким образом

    Если session_destroy() не будет вызвана, и не будут очищены куки, то при новом запуске скрипта, данные из хранилища, записанные в него ранее, появятся в $_SESSION , даже если при этом запуске скрипта, вручную в $_SESSION вы их не добавите.

    // Эту строку пишем, чтобы очистить данные о сессии в текущем запуске скрипта $_SESSION = ; //Эта строка удаляет SID @unset($_COOKIE); //Удаляет хранилище сессии: session_destroy();

    Сессии в PHP представляют из себя механизм сохранения на стороне сервера информации о компьютере клиента. На самом деле сессии в PHP - это не такая сложная тема, но для её понимания нужно знать принцип работы cookie в PHP . Так что, если вы не знаете как работают cookie в PHP, то сначала читайте соответствующую статью, а потом уже возвращайтесь сюда.

    Слово session с английского переводится как сеанс, так сам смысл сессий в PHP становится более понятным, но у программистов прижился термин "сессии", его и мы будем использовать в этой статье.

    Сессии в PHP очень похожи на механизм cookie, те же самые пары ключ => значение, только они хранятся на стороне сервера.

    Функция session_start()

    Сеанс нам нужно начать, для этого существует функция session_start() . Эта функция стартует сеанс, или сессию, как угодно можно назвать это.

    Функция session_start() желательно вызывать в самом начале страницы, но в моих примерах я этого не делаю.

    Массив $_SESSION

    Сессии - это группы переменных, которые хранятся на сервере, но относятся к одному уникальному посетителю. Повторю, это ключевой момент: сессии хранятся на сервере .

    Для того, чтобы обеспечить взаимодействие каждого посетителя с его данными из его сессии используется файл cookie, команду создать который PHP даёт сам, вам об это беспокоится не нужно. Этот cookie имеет значение только для сервера и не может быть использован для получения данных о пользователе.

    На сервере данные сессии хранятся в текстовом файле и они доступны в программе PHP в массиве $_SESSION . Чтобы сохранить переменную в сессии нужно присвоить ей значение в этом массиве.

    Давайте наконец начнём использовать примеры. Всё очень просто.

    Сессии в PHP значение."; ?>

    Теперь попробуем получить значение из массива $_SESSION в другом примере.

    Сессии в PHP

    Обратите внимание, если во втором примере мы удалим функцию session_start() то у нас не будет доступа к данным массива $_SESSION .

    Функция session_id()

    После того, как сессия создана, вы автоматически получаете доступ к уникальномы идентификатору сессии при помощи функции session_id() . Эта функция позволяет как задавать, так и получать значение идентификатора сессии.

    Сессии в PHP

    Можете посмотреть в панели инструментов для разработчиков вашего браузера (в Chrome для этого нажмите Ctrl + Shift + I, потом Resources, и там найдёте cookie), этот домен положил вашему браузеру cookie с именем PHPSESSID и примерно таким значением: "7g5df9rkd1hhvr33lq1k6c72p7".

    Именно по значению PHPSESSID сервер будет определять ваш браузер и работать с соответствующим набором переменных, которые будут доступны скрипту через массив $_SESSION, как уже писалось ранее.

    Функция session_name()

    Если функции session_id() позволяет получать значение идентификатора сессии, функция session_name() позволяет узнать имя сессии.

    Сессии в PHP

    Ещё раз про функцию session_start()

    Теперь мы знаем больше про мешанизм работы сессий в PHP и нужно ещё раз вернуться к функции session_start() . Эта функция инициализирует механизм сессий для текущего пользователя. Как именно это происходит:

    • Если пользователь запустил сайт впервые, то session_start() устанавливает cookie у клиента и создаёт временное хранилище на сервере, связанное с идентификатором пользователя.
    • Определяет хранилище, связанное с переданным текущим идентификатором.
    • Если в хранилище на сервере есть данные, они помещаются в массив $_SESSION.
    • Если register_globals из файла php.ini равен On, то все элементы массива $_SESSION превращаются в глобальные переменные.

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

    Сейчас мы рассмотрим пример, который позволит провести небольшие эксперименты с сессиями.

    Сессии в PHP

    Счётчик

    В текущей сессии вы открыли страницу раз.

    Открыть пример в ">этой вкладке.

    Вся работа сессий основана на массиве $_SESSION , это хорошо видно в данном примере.

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

    Завершение сессии

    Для того, чтобы завершить сессию нам нужно:

    1. Очистить массив $_SESSION.
    2. Удалить временное хранилище на сервере.
    3. Удалить сессионный cookie.

    Очистить массив $_SESSION можно при помощи функции session_unset() .

    Функция session_destroy() удаляет временное хранилище на сервере. Кстати, она больше ничего не делает.

    Удалить сессионный cookie нужно при помощи функции setcookie() , которую мы изучили в уроке pабота с cookie в PHP .

    Пример завершения сессии:

    Завершение сессии

    Сессия завершена.

    Теперь можете провести эксперимент: запустить в одном окне пример со счётчиком, накрутить счётчик, а потом запусть пример с удалением сессии и снова обновить страницу со счётчиком.

    Удаление файла cookies можно сделать так:

    setcookie(session_name(), "", time() - 60*60*24*32, "/")

    Ещё раз про функции session_name() и session_id()

    Функции session_name() и session_id() на практике используются редко, но я о них пишу, так как в статье нужно раскрыть сам механизм работы сессий в PHP.

    При помощи этих функций можно задавать собственные имена и идентификаторы сессий, но делать это не рекомендуется. Если вы захотели задать их, то пропишите эти функции с аргументами перед функцией session_start() , как в примере ниже:

    Сессии в PHP

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

    Тут подробней остановимся, если вы запустите пример из секции про функцию session_name() (вот ссылка) в разных браузерах (например в Chrome и в Internet Explorer), то в каждом браузере будет свой, уникальный идентификатор сессии. Браузеры хранят файлы cookies каждый в своей папке, поэтому функция session_start() даст каждому браузеру создать свой, уникальный идентификатор и, соответственно, для каждого браузера будет создано уникальное хранилище на сервере. Поэтому пример со счётчиком (этот) в каждом браузере будет работать независимо друг от друга.

    Если задать одинаковый идентификатор сессии для всех пользователей, то они будут работать с одним хранилищем на сервере. Вот пример счётчика, который будет считать посещения с разных браузеров:

    100) { session_unset(); session_destroy(); } ?> Сессии в PHP

    Счётчик №2

    Открыли страницу в разных браузерах раз.

    Открыть пример в ">этой вкладке.

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

    Установка времени ожидания

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

    Время жизни сессии можно изменить используя функцию session_set_cookie_params() , вот её синтаксис.

    session_set_cookie_params (int lifetime [, string path [, string domain [, bool secure]]])

    На практике достаточно использовать только первый параметр (lifetime), сюда записываете время в секундах, определяющее сколько сервер должен помнить состояние сессии после закрытия браузера.

    Действие функции session_set_cookie_params() распространяется только на период работы скрипта.

    Вот пример использования этой функции:

    Сессии в PHP

    Счётчик №3

    Значение счётчика: .

    Открыть счётчик в ">этой вкладке.

    Накрутите счётчик и закройте браузер, через 30 сукунд опять откройте этот пример. Ваша сессия сохранится.

    Как уже известно, протокол HTTP позволяет веб-приложениям устанавливать "сессии" - диалог между клиентом и сервером, причём состояние этого диалога сохраняется от запроса к запросу.

    Язык PHP, являясь в основном языком для веб-программирования, предоставляет возможность пользоваться механизмом сессий HTTP, беря на себя большую часть забот при организации и хранении данных сессий. Напомню, что необходимо для работы механизма сессий HTTP:

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

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

    • Проверяет, не прислал ли клиент номер уже существующей сессии в Cookie или в параметрах запроса. Если клиент прислал номер сессии, то данные этой сессии загружаются из места постоянного хранения (например, файла) в память, и становятся доступны программе через массив $_SESSION. Если клиент не прислал номера сессии или такой сессии не существует на сервере - создаётся новая сессия с новым номером, а её данные также доступны через массив $_SESSION, который в случае новой сессии будет пустым. Номер вновь созданной сессии помещается в поле заголовка ответа сервера Set-Cookie.
    • Обеспечивает сохранение данных сессии. После того, как PHP-программа обработала запрос, текущее состояние массива $_SESSION сохраняется в месте постоянного хранения, чтобы вновь стать доступным при следующем запросе клиента.

    Теперь, зная подробности, которые скрываются за session_start(), можем поиграть с этим механизмом. Пример ниже хранит в сессии одно число, которое увеличивается на единицу с каждым запросом клиента:

    При первом заходе на эту страничку, сервер пришлёт браузеру куки с номером сессии:

    Set-Cookie : PHPSESSID=4ftvca7jmmnm04q95r3sdsk6r6; path=/

    И этот же номер сессии браузер будет отправлять обратно серверу при каждом последующем запросе. Теперь, если в браузере очистить куки, на сервере будет создана новая сессия с другим номером, и счёт в нашем тестовом скрипте начнётся заново.

    Более реальный пример: логин пользователя

    Чаще всего сессии используются при логине пользователя на сайт. При входе на сайт, пользователь вводит логин и пароль, которые проверяет сервер. Если логин правильный, то сервер должен запомнить данные пользователя в сессии, чтобы не спрашивать больше логин с паролем. В простейшем случае получится такой пример:

    array("password" => "123", "title" => "Администратор",), "user" => array("password" => "qwe", "title" => "Пользователь",),); return isset($users[$login])? $users[$login]: null; } function getCurrentUser() { $user = isset($_SESSION["user"])? $_SESSION["user"]: null; return $user; } function setCurrentUser($user) { $_SESSION["user"] = $user; } ?>

    Привет, !
    Ссылка1 Ссылка2

    Выйти Вы еще не зашли на сайт. Введите логин и пароль:
    Логин: Пароль:

    Эта программка запрашивает логин и пароль, причём можно войти с логином user , qwe или admin , 123 . Залогиненному пользователю показывается приветствие. При логине отображается сообщение, если имя пользователя или пароль указаны неверно.

    Как только удалось зайти на этот "сайт", можно покликать по ссылкам (Ссылка1, Ссылка2), оставаясь при этом залогиненным пользователем.

    Какие данные можно хранить в сессии?

    По умолчанию PHP хранит данные сессии во временном файле в виде текста. В этом можно убедиться, заглянув в директорию с временными файлами PHP. Эта директория указана в phpinfo() в разделе Environment, TEMP. В этой директории вы найдёте файлы вида sess_4ftvca7jmmnm04q95r3sdsk6r6 , где 4ftvca7jmmnm04q95r3sdsk6r6 - номер сессии, переданный в Cookie. Загляните в этот файл: если вы запустили самый первый пример выше, то в файле обнаружится примерно такое содержимое: "value|i:2;". Этот текст представляет собой сериализованное представление содержимого сессии, где хранится всего лишь одна переменная с числом.

    Все значения, которые PHP-программа помещает в сессию через массив $_SESSION, при сохранении сессии превращаются в текстовый вид, а затем записываются в файл. Процесс преобразования значений переменных в текст называется "сериализацией". Таким образом, в сессию можно поместить любые данные, которые PHP способен сериализовать.

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

    "; print_r($_SESSION); echo ""; $_SESSION["testArray"] = array(1, 2, 3, "one", "two", "three", "child" => array(5, 6, 7),); $obj = new stdClass(); $obj->x = 1234; $obj->y = 4567; $_SESSION["testObject"] = $obj;

    Этот пример запишет в файл сессии такие данные:

    TestArray|a:7:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;s:3:"one";i:4;s:3:"two";i:5;s:5:"three";s:5:"child";a:3:{i:0;i:5;i:1;i:6;i:2;i:7;}}testObject|O:8:"stdClass":2:{s:1:"x";i:1234;s:1:"y";i:4567;}

    Хранение объектов в сессии

    В сессии, как видно, можно хранить объекты. Но при этом следует помнить, что сохраняя в сессии объекты, ссылающиеся каким-либо образом на ваши "самодельные" классы, или объекты-экземпляры ваших классов, необходимо, чтобы объявление этих классов делалось до момента вызова session_start(). То есть, PHP должен знать класс до того, как встретит упоминание о нём при десериализации данных сессии.

    При сохранении объектов бывают ситуации, когда стандартная сериализация объекта по каким-либо причинам неприемлема или вовсе невозможна. В таких случаях можно реализовать сериализацию вручную, объявив в классе "волшебные" методы __sleep() и __wakeup() .

    Кстати , сериализацию возможно осуществлять и "вручную", причём не обязательно для сохранения/загрузки данных сессии. Понадобиться это может, когда некоторые данные в приложении надо сохранить для использования позже, или передать по сети. Функции, которые могут пригодиться при сериализации/десериализации - serialize() , unserialize() , json_encode() , json_decode() .

    Что нельзя хранить в сессии?

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

    Дополнительные возможности

    PHP предоставляет разработчику возможность реализовать свой способ хранения данных сессии, например, в базе данных. Для этого необходимо реализовать функции, которые будут сохранять и загружать данные сессии из места постоянного хранения. Затем об этих функциях надо пообщить PHP, вызвав функцию session_set_save_handler.

    Для ускорения процесса сохранения и загрузки данных сессии на высоко нагруженных сайтах может использоваться сервер Memcached, который хранит данные в памяти. Поддержка этого способа хранения сессий встроена в PHP и настраивается через файл конфигурации php.ini.

    Можно задать имя параметра Сookie, через который передаётся номер сессии, указав его имя, время жизни, домен и другие параметры.

    Эти и многие другие возможности настройки сессий HTTP в PHP доступны через функции session_*.

    С самого начала PHP все приняли на ура, но как только на этом языке стали создавать достаточно крупные проекты, разработчики столкнулись с новой проблемой - в PHP отсутствовало понятие глобальных переменных! То есть, выполнялся некий скрипт, посылал сгенерированную страницу клиенту, и все ресурсы, используемые этим скриптом уничтожались. Попробую проиллюстрировать: предположим есть две страницы одного сайта, index.php и dothings.php. Исходники к этим страницам выглядят так:

    index.php dothings.php

    Если выполнить эти два скрипта, то на первой странице мы увидим надпись "Меня задали на index.php", а вторая страница будет пустой.

    Разработчики web-сайтов, недолго думая, стали использовать cookie для хранения глобальных переменных на стороне клиента. Процесс выглядел примерно так: пользователь приходит на главную страницу сайта, делает какие-то действия, и вся информация, связанная с этим пользователем, которая может потребоваться на других страницах сайта, будет храниться у него в браузере в виде cookie. Этот метод имеет довольно серьезные минусы, из-за которых от PHP в своё время отвернулось немало разработчиков. Например, нам нужно авторизовать пользователя, чтобы разрешить ему доступ к закрытым (или принадлежащим только ему) разделам сайта. Придется отправлять пользователю cookie, который будет служит его последующим идентификатором на сайте. Такой подход становится очень громоздким и не удобным, как только сайт начинает собирать всё больше и больше сведений о поведении пользователя, ведь всю информацию, посылаемую пользователю, желательно кодировать, чтобы её нельзя было подделать. Ещё совсем недавно подделкой cookie можно было "уложить" не один чат, а порой и пробраться в чужую почту. К тому же есть ещё на свете странные люди, у которых браузер cookie не поддерживает.

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

    Как работать с сессиями?

    Если вы будете тестировать примеры из статьи (или ваши скрипты) на каком-либо коммерческом хостинге, проблем с работой с сессиями быть не должно. Если же вы сами настраивали ваш сервер (будь то реальный сервер, или эмулятор), могут появляться ошибки примерно такого содержания:

    "Warning: open(/var/state/php/sess_6f71d1dbb52fa88481e752af7f384db0, O_RDWR) failed: No such file or directory (2)".

    Это значит всего лишь, что у вас неправильно настроен PHP. Решить эту проблему можно, прописав правильный путь (на существующую директорию) для сохранения сессий в файле php.ini и перезапустить сервер.

    Любой скрипт, который будет использовать переменные (данные) из сессий, должен содержать следующую строчку:

    Session_start();

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

    Session_start(); ?> ... Для задания директории в которой будут сохраняться файлы сессий используется функция session_save_path() : session_save_path($_SERVER["DOCUMENT_ROOT"]."/session"); session_start();

    После начала сессии можно задавать глобальные переменные. Ари присвоении какого-либо значения любому полю массива $_SESSION, переменная с таким же именем автоматически регистрируется, как переменная сессии. Этот массив доступен на всех страницах, использующих сессию. Для примера разберем програму:

    index.php Всё ОК. Сессию загрузили! Пройдём, посмотрим что там: dothings.php

    При последовательном запуске этих файлов, первый скрипт "index.php" выдаст следующий результат:

    Всё ОК. Сессию загрузили! Пройдём, посмотрим что там:

    А второй "dothings.php" вот это:

    Меня задали на index.php

    Переменная $a теперь доступна на всех страницах данного сайта, которые запустили сессии.

    Другие полезные функции и приемы для работы с сессиями:

    • unset($_SESSION["a"]) - сессия "забывает" значение заданной сессионой переменной;
    • session_destroy () - сессия уничтожается (например, если пользователь покинул систему, нажав кнопку "выход");
    • session_set_cookie_params (int lifetime [, string path [, string domain]]) - с помощью этой функции можно установить, как долго будет "жить" сессия, задав unix_timestamp определяющий время "смерти" сессии. По умолчанию, сессия "живёт" до тех пор, пока клиент не закроет окно браузера.
    • session_write_close () - запись переменных сесии и закрытие ее. Это необходимо для открытия сайта в новом окне, если страница выполняет длительную обработу и заблокировала для вашего браузера файл сессий.

    Примеры

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

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

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

    Наш пример будет состоять из трёх файлов: index.php, authorize.php и secretplace.php. Файл index.php содержит форму, где пользователь введёт свой логин и пароль. Эта форма передаст данные файлу authorize.php, который в случае успешной авторизации допустит пользователя к файлу secretplace.php, а в противном случае выдаст сообщение об ошибке.

    Примеры: index.php Вводи пароль

    Логин:
    Пароль:
    authorize.php страницу... header("Location: secretplace.php"); exit; } } // если что-то было не так, то пользователь получит // сообщение об ошибке. ?> Вы ввели неверный пароль! secretplace.php Привет, , ты на секретной странице!!! :)

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

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

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

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

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

    • Файл authorize.php - попытка подбора пароля с помощью стороннего скрипта;
    • Файл secretplace.php - попытка обмануть программу путём вписывания значений переменной $logged_user в адресной строке браузера, например так:
      "http://www.yoursite.ru/secretplace.php?logged_user=hacker "

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

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

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

    authorize.php V2 страницу... header("Location: secretplace.php"); exit; } } } ?> Вы ввели неверный пароль!
    Как избавиться от "дыры" номер 2?

    Предположим, у вас есть сайт, где каждый смертный может зарегистрироваться чтобы добавлять сообщения в форум. Естественно, в форуме у некоторых пользователей (админов, модераторов), возможностей больше чем у других, они, например, могут удалять сообщения других пользователей. Уровень доступа пользователя вы храните в сессии, в переменной $user_status, где $user_status = 10 соответствует полному доступу к системе. Пришедшему на сайт злоумышленнику достаточно зарегистрироваться штатным образом, а потом дописать в адресной строке браузера ?user_status=10 . Вот и завёлся у вас на форуме новый админ!

    В принципе, любую переменную скрипта можно задать через адресную строку, просто дописав после полного адреса к скрипту вопросительный знак и название переменной с её значением. Давайте поправим наш код, чтобы этого избежать:

    secretplace.php V2 переменную unset($_SESSION["logged_user"]); // открываем сессию session_start(); /* просто зайти на эту страницу нельзя... если имя пользователя не зарегистрировано, то перенаправляем его на страницу index.php для ввода логина и пароля... тут на самом деле можно много чего сделать, например запомнить IP пользователя, и после третьей попытки получить доступ к файлам, его перекрыть. */ if(!isset($_SESSION["logged_user"])){ header("Location: index.php"); exit; } ?> Привет, , ты на секретной странице! Итоги

    Механизм сессий - довольно удачная особенность языка PHP. Сессии просты, очень гибки в использовании. Кстати, есть одна, мало где документированная возможность сессий PHP (доступна начиная с версии 4.0.3) - в сессиях можно хранить не только переменные, но и объекты.

    Примеры

    ?>
    // Автоматическая вставка SID в ссылки. ini_set("session.use_trans_sid", true); session_start(); ?> Click here!
    Click here!!

    // Пример работы с сессиями. session_start(); // Если на сайт только-только зашли, обнуляем счетчик. if (!isset($_SESSION["count"])) $_SESSION["count"] = 0; // Увеличиваем счетчик в сессии. $_SESSION["count"] = $_SESSION["count"] + 1; ?>

    Счетчик

    раз(а).
    Закройте браузер, чтобы обнулить счетчик.
    " target="_blank"> Открыть дочернее окно браузера.
    // Простой пример использования сессий без Cookies. session_name("test"); session_start(); $_SESSION["count"] = @$_SESSION["count"] + 1; ?>

    Счетчик

    В текущей сессии работы с браузером Вы открыли эту страницу раз(а).
    Закройте браузер, чтобы обнулить этот счетчик.
    ?">Нажмите сюда для обновления страницы!