В этой лекции мы разберем, что такое
Что такое
В информационных технологиях все примерно так же. В сети существует огромное количество ресурсов, т.е. множество "библиотек". У каждой из них свой "библиотекарь", т.е. человек или группа людей, отвечающих за содержание ресурса и предоставление пользователям информации. Их называют администраторами. Функции администратора, как правило, включают добавление новой информации, удаление и редактирование существующей, настройка способов отображения информации пользователю. А в
Как же отличить пользователя от администратора? В реальной библиотеке это как-то очевидно, но если роли библиотекаря и посетителя библиотеки перенести в виртуальную реальность, то эта очевидность исчезает. Библиотекарь, как и посетитель, имеет доступ к библиотечным ресурсам через Internet. А согласно протоколу HTTP все клиенты абсолютно равноправны. Как же понять, кто зашел на сайт? Обычный пользователь (посетитель) или администратор (библиотекарь)? Если это простой пользователь, то как сохранить это знание, чтобы не допустить посетителя в закрытые архивы сайта? То есть возникает вопрос, как идентифицировать клиента, который послал запрос, и сохранять сведения о нем, пока он находится на сайте?
Самый простой вариант, который приходит в голову, - это регистрация человека в системе и выдача ему аналога читательского билета, а именно логина и пароля для входа в административную часть системы. Эта информация хранится на компьютере-сервере, и при входе в систему проверяется соответствие введенных пользователем логина и пароля тем, что хранятся в системе. Правда, здесь по сравнению с реальной библиотекой ситуация изменяется: читательский билет требуется библиотекарю для входа в закрытую часть системы, а читатель может заходить на сайт свободно. В принципе можно регистрировать и простых посетителей. Тогда всех зарегистрированных пользователей нужно разделить на группы: библиотекари (администраторы) и читатели (простые пользователи), наделив их соответствующими правами. Мы не будем вдаваться в эти тонкости и воспользуемся самым простым вариантом, когда ввод логина и пароля требуется для доступа к некоторым страницам сайта.
Пример 12.1.
У нас имеется файл index.html - домашняя страничка Васи Петрова
<html> <head><title>My home page</title></head> <body> Привет всем! Меня зовут Вася Петров и это моя домашняя страничка. <a href="secret_info.html">Для Пети</a> </body></html>
и файл secret_info.html, который содержит секретную информацию, читать которую разрешено только Васиному другу Пете.
<html> <head><title>Secret info</title></head> <body> <p>Здесь я хочу делиться секретами с другом Петей.</p> </body></html>
Если оставить оба эти файла как есть, то любой посетитель, кликнув на ссылку "Для Пети", попадет на секретную страничку. Чтобы этого избежать, нужно добавить промежуточный скрипт, который будет проверять, действительно ли Петя хочет попасть на секретную страничку. И сделать так, чтобы главный файл ссылался не сразу на secret_info.html, а сначала на этот скрипт.
<html> <head><title>My home page</title></head> <body> <p>Привет всем! Меня зовут Вася Петров и это моя домашняя страничка. </p> <a href="authorize.php">Для Пети</a> </body> </html>
Сам скрипт авторизации должен предоставлять форму для ввода логина и пароля, проверять их правильность и перенаправлять на секретную страничку, если проверка прошла успешно, и выдавать сообщение об ошибке в противном случае.
<?
if (!isset($_GET['go'])){
// проверяем, отправлены ли данные формой
echo "<form>
// форма для авторизации
//(ввода логина и пароля)
Login: <input type=text name=login>
Password: <input type=password
name=passwd>
<input type=submit name=go value=Go>
</form>";
}else {
// если форма заполнена, то сравниваем логин
// и пароль с правильными логином и паролем
if ($_GET['login']=="pit"
$_GET['passwd']=="123") {
Header("Location: secret_info.html");
//и перенаправляем на секретную страницу
}else echo "Неверный ввод,
попробуйте еще раз<br>";
}
?>
Вроде бы все достаточно просто. Но допустим, у нас не одна секретная страничка, а несколько. Причем они связаны между собой перекрестными ссылками. Тогда возникает необходимость постоянно помнить пароль и логин посетителя сайта (если он таковой имеет). Чтобы решить эту проблему, можно в каждую страницу встроить скрипт, который будет передавать логин и пароль от страницы к странице в качестве скрытых параметров формы. Но такой способ не совсем безопасен: эти параметры можно перехватить и подделать. В PHP существует более удобный и
Cессии - это механизм, который позволяет создавать и использовать переменные, сохраняющие свое значение в течение всего времени работы пользователя с сайтом.
Эти переменные для каждого пользователя имеют различные значения и могут использоваться на любой странице сайта до выхода пользователя из системы. При этом каждый раз, заходя на сайт, пользователь получает новые значения переменных, позволяющие идентифицировать его в течение этого сеанса или
Задача
Существует несколько способов передачи
С помощью
С помощью параметров адресной строки.
В этом случае
Например: адрес http://green.nsu.ru/test.php превращается в адрес http://green.nsu.ru/test.php?PHPSESSID=ac4f4a45bdc893434c95dcaffb1c1811
Этот способ передачи идентификатора используется автоматически, если у браузера, отправившего запрос, выключены
Кроме перечисленных вариантов передачи
Прежде чем начать работать с
Настройки PHP, в том числе и для работы с
Как мы уже знаем,
/tmp. И если в корневой директории сервера такой папки нет, то при запуске
Сервер может обрабатывать большое количество N;/dir. Это значение нужно обязательно взять в кавычки, поскольку точка с запятой является одним из символов комментариев в
Например: 2;/Temp определяет, что переменные c:\Temp\0\a\, c:\Temp\0\b\ и т.п.
Хранение данных на стороне клиента осуществляется с помощью
"1" )
"0", т.е. данные в
Кроме этих параметров, полезными могут оказаться
Имя PHPSESSID и используется в "1". Для кодирования данных
Существует еще множество настроек, с которыми можно познакомиться в документации или непосредственно в
Первое, что нужно сделать для работы с "0" (если , то
session_start();
Получив такую команду, сервер создает новую
Команду session_start() нужно вызывать во всех скриптах, в которых предстоит использовать переменные
Получить идентификатор текущей
Для наглядности . Делать это нужно еще до инициализации
Пример 12.2. Создание сессии
Переименуем наш файл index.html, чтобы обрабатывались
<?
session_start();
// создаем новую сессию или
// восстанавливаем текущую
echo session_id();
// выводим идентификатор сессии
?>
<html>
<head><title>My home page</title></head>
... // домашняя страничка
</html>
<?
echo session_name();
// выводим имя текущей сессии.
// В данном случае это PHPSESSID
?>
Если проделать то же самое с файлом authorize.php, то значения выводимых переменных (id
Однако от самих идентификатора и имени
session_register(имя_переменной1,
имя_переменной2, ...);
Заметим, что регистрируются не значения, а имена переменных. Зарегистрировать переменную достаточно один раз на любой странице, где используются $. Все зарегистрированные таким образом переменные становятся глобальными (т.е. доступными с любой страницы) в течение данной
Зарегистрировать переменную также можно, просто записав ее значение в ассоциативный
$_SESSION['имя_переменной'] =
'значение_переменой';
В этом массиве хранятся все зарегистрированные (т.е. глобальные) переменные
Доступ к таким переменным осуществляется с помощью массива $_SESSION['имя_переменной'] (или $HTTP_SESSION_VARS['имя_переменной'] для версии PHP 4.0.6 и более ранних). Если же в настройках php включена опция
Если (отключены), то пользоваться session_register() ; более того, начиная с версии PHP 6.0.0, эта функция станет недоступна. Вместо этого, для $_SESSION.)
Пример 12.3. Регистрация переменных
Зарегистрируем логин и пароль, вводимые пользователем на странице авторизации.
<?
session_start();
// создаем новую сессию или
// восстанавливаем текущую
if (!isset($_GET['go'])){
echo "<form>
Login: <input type=text name=login>
Password: <input type=password
name=passwd>
<input type=submit name=go value=Go>
</form>";
}else {
$_SESSION['login']=$_GET['login'];
// регистрируем переменную login
$_SESSION['passwd']=$_GET['passwd'];
// регистрируем переменную passwd
// теперь логин и пароль - глобальные
// переменные для этой сессии
if ($_GET['login']=="pit"
$_GET['passwd']=="123") {
Header("Location: secret_info.php");
// перенаправляем на страницу
// secret_info.php
}else echo "Неверный ввод,
попробуйте еще раз<br>";
}
print_r($_SESSION);
// выводим все переменные сессии
?>
Теперь, попав на страничку secret_info.php, да и на любую другую страницу сайта, мы сможем работать с введенными пользователем логином и паролем, которые будут храниться в
<?php
session_start();
// создаем новую сессию или
// восстанавливаем текущую
print_r($_SESSION);
// выводим все переменные сессии
?>
<html>
<head><title>Secret info</title></head>
<body>
<p>Здесь я хочу делиться секретами
с другом Петей.
</body>
</html>
То мы получим в браузере на секретной странице следующее:
Array ( [login] => pit [passwd] => 123 ) Здесь я хочу делиться секретами с другом Петей.
В итоге получим
Что это нам дает? Допустим, хакер хочет прочитать секреты Васи и Пети. И он как-то узнал, как называется секретная страничка (или странички). Тогда он может попытаться просто ввести ее адрес в строке браузера, минуя страницу авторизации (ввода пароля). Чтобы избежать такого проникновения в наши тайны, нужно дописать всего пару строк в код секретных страничек:
<?php
session_start();
// создаем новую сессию или
// восстанавливаем текущую
print_r($_SESSION);
// выводим все переменные сессии
if (!($_SESSION['login']=="pit"
$_SESSION['passwd']==123))
// проверяем правильность
// пароля-логина
Header("Location: authorize.php");
// если ошибка, то перенаправляем на
// страницу авторизации
?>
<html>
<head><title>Secret info</title></head>
... // здесь располагается
//секретная информация :)
</html>
Кроме умения регистрировать переменные
unset(). Она не возвращает никакого значения, а просто уничтожает указанные переменные.
Где это может пригодиться? Например, для уничтожения данных о посетителе (в частности, логина и пароля) после его ухода с секретной странички. Если правильные логин и пароль сохранятся и окно браузера после посещения сайта не закрыли, то любой другой пользователь этого компьютера сможет прочитать закрытую информацию.
Пример 12.4. Уничтожение переменных сессии
В файл secret_info.php добавим строчку для выхода на главную страницу:
<?php
// ... php код
?>
<html>
<head><title>Secret info</title></head>
... // здесь располагается
// секретная информация :)
<a href="index.php">На главную</a>
</html>
В Index.php уничтожим логин и пароль, введенные ранее:
<?
session_start();
session_unregister('passwd');
// уничтожаем пароль
unset($_SESSION['login']);
// уничтожаем логин
print_r($_SESSION);
// выводим глобальные переменные сессии
?>
<html>
<head><title>My home page</title></head>
... // домашняя страничка
</html>
Теперь, чтобы попасть на секретную страницу, нужно будет опять вводить логин и пароль.
Для того чтобы сбросить значения всех переменных
Уничтожить текущую
<?
session_start(); // инициализируем сессию
$test = "Переменная сессии";
$_SESSION['test']= $test;
// регистрируем переменную $test.
// если register_globals=on,
// то можно использовать
// session_register('test');
print_r($_SESSION);
// выводим все глобальные переменные
echo session_id();
// выводим идентификатор сессии
echo "<hr>";
session_unset();
// уничтожаем все глобальные
// переменные сессии
print_r($_SESSION);
echo session_id();
echo "<hr>";
session_destroy(); // уничтожаем сессию
print_r($_SESSION);
echo session_id();
?>
В результате работы этого скрипта будут выведены три строки: в первой - массив с элементом test и его значением, а также
Вообще говоря, cледует понимать, что использование механизма
Во-первых, опасно передавать туда-сюда пароль, его могут перехватить. Кроме того, мы зарегистрировали его как глобальную переменную my_user и паролем my_passwd.
Во-вторых, что делать, если кто-то написал скрипт подбора пароля для секретной страницы? В этом случае на страницу авторизации много раз должен стучаться какой-то посторонний скрипт. Поэтому нужно просто проверять, с нашего ли сайта пришел запрос на авторизацию, и если нет, то не пускать его дальше. Адрес страницы, с которой поступил запрос, можно получить с помощью глобальной переменной
<?
session_start();
// создаем новую сессию или
// восстанавливаем текущую
$conn = mysql_connect("localhost",
"my_user","my_passwd");
// устанавливаем соединение с сервером БД
mysql_select_db("test");
// выбираем рабочую базу данных
$SERVER_ROOT = "http://localhost/~nina/tasks/sessions/";
// где находятся наши скрипты
/* с помощью регулярного выражения
^$SERVER_ROOT и функции eregi проверяем,
начинается ли адрес ссылающегося скрипта,
т.е. строка $_SERVER['HTTP_REFERER'])
со строки $SERVER_ROOT (как у нас) */
if(eregi("^$SERVER_ROOT",
$_SERVER['HTTP_REFERER'])){
// если да, то делаем почти то же, что и
// раньше, пароль регистрировать не будем
if (!isset($_POST['go'])){
echo "<form method=POST >
Login: <input type=text name=login>
Password: <input type=password name=passwd>
<input type=submit name=go value=Go>
</form>";
}else {
/* запрос к базе данных: выбираем из таблицы
users login, который совпадает с переданным
по запросу, причем пароль у него тоже должен
совпасть с введенным пользователем.
Если этого нет, то считаем, что логин и
пароль введены неверно */
$sql = "SELECT login FROM users
WHERE login='" . $_POST['login'] . "' AND passwd='" . $_POST['passwd'] . "';";
$q = mysql_query($sql,$conn); // отправляем запрос к БД
$n = mysql_num_rows($q); // число строк в ответе на запрос
if (!$n==0){
$_SESSION['user_login']=$_POST['login'];
// регистрируем переменную login
Header("Location: secret_info.php");
// перенаправляем на страницу secret_info.php
}else echo "Неверный ввод, попробуйте еще раз<br>";
}
print_r($_SESSION); // выводим все переменные сессии
}
?>
Вроде бы первые две проблемы решены. Но есть еще одна. Что делать, если хакер просто допишет в строку запроса значение какой-нибудь глобальной переменной (например, логина)? Вообще это возможно, только если . Просто иначе мы используем для работы с глобальными переменными $user_login. Потом данную переменную нужно опять зарегистрировать, но не как новую, а как уже существующую. Для этого знак доллара при регистрации НЕ опускается. Вот что получилось:
<?php
unset($user_login); // уничтожаем переменную
session_start(); // создаем новую сессию или
// восстанавливаем текущую
session_register($user_login);
// регистрируем переменную
// как уже существующую
if (!($user_login=="pit")) // проверяем логин
Header("Location: authorize.php");
// если ошибка, то перенаправляем
// на страницу авторизации
?>
<html>
<head><title>Secret info</title></head>
... // здесь располагается
// секретная информация :)
</html>
Итак, мы познакомились с
В этой лекции мы разберем, что такое
Что такое
В информационных технологиях все примерно так же. В сети существует огромное количество ресурсов, т.е. множество "библиотек". У каждой из них свой "библиотекарь", т.е. человек или группа людей, отвечающих за содержание ресурса и предоставление пользователям информации. Их называют администраторами. Функции администратора, как правило, включают добавление новой информации, удаление и редактирование существующей, настройка способов отображения информации пользователю. А в
Как же отличить пользователя от администратора? В реальной библиотеке это как-то очевидно, но если роли библиотекаря и посетителя библиотеки перенести в виртуальную реальность, то эта очевидность исчезает. Библиотекарь, как и посетитель, имеет доступ к библиотечным ресурсам через Internet. А согласно протоколу HTTP все клиенты абсолютно равноправны. Как же понять, кто зашел на сайт? Обычный пользователь (посетитель) или администратор (библиотекарь)? Если это простой пользователь, то как сохранить это знание, чтобы не допустить посетителя в закрытые архивы сайта? То есть возникает вопрос, как идентифицировать клиента, который послал запрос, и сохранять сведения о нем, пока он находится на сайте?
Самый простой вариант, который приходит в голову, - это регистрация человека в системе и выдача ему аналога читательского билета, а именно логина и пароля для входа в административную часть системы. Эта информация хранится на компьютере-сервере, и при входе в систему проверяется соответствие введенных пользователем логина и пароля тем, что хранятся в системе. Правда, здесь по сравнению с реальной библиотекой ситуация изменяется: читательский билет требуется библиотекарю для входа в закрытую часть системы, а читатель может заходить на сайт свободно. В принципе можно регистрировать и простых посетителей. Тогда всех зарегистрированных пользователей нужно разделить на группы: библиотекари (администраторы) и читатели (простые пользователи), наделив их соответствующими правами. Мы не будем вдаваться в эти тонкости и воспользуемся самым простым вариантом, когда ввод логина и пароля требуется для доступа к некоторым страницам сайта.
Пример 12.1.
У нас имеется файл index.html - домашняя страничка Васи Петрова
<html> <head><title>My home page</title></head> <body> Привет всем! Меня зовут Вася Петров и это моя домашняя страничка. <a href="secret_info.html">Для Пети</a> </body></html>
и файл secret_info.html, который содержит секретную информацию, читать которую разрешено только Васиному другу Пете.
<html> <head><title>Secret info</title></head> <body> <p>Здесь я хочу делиться секретами с другом Петей.</p> </body></html>
Если оставить оба эти файла как есть, то любой посетитель, кликнув на ссылку "Для Пети", попадет на секретную страничку. Чтобы этого избежать, нужно добавить промежуточный скрипт, который будет проверять, действительно ли Петя хочет попасть на секретную страничку. И сделать так, чтобы главный файл ссылался не сразу на secret_info.html, а сначала на этот скрипт.
<html> <head><title>My home page</title></head> <body> <p>Привет всем! Меня зовут Вася Петров и это моя домашняя страничка. </p> <a href="authorize.php">Для Пети</a> </body> </html>
Сам скрипт авторизации должен предоставлять форму для ввода логина и пароля, проверять их правильность и перенаправлять на секретную страничку, если проверка прошла успешно, и выдавать сообщение об ошибке в противном случае.
<?
if (!isset($_GET['go'])){
// проверяем, отправлены ли данные формой
echo "<form>
// форма для авторизации
//(ввода логина и пароля)
Login: <input type=text name=login>
Password: <input type=password
name=passwd>
<input type=submit name=go value=Go>
</form>";
}else {
// если форма заполнена, то сравниваем логин
// и пароль с правильными логином и паролем
if ($_GET['login']=="pit"
$_GET['passwd']=="123") {
Header("Location: secret_info.html");
//и перенаправляем на секретную страницу
}else echo "Неверный ввод,
попробуйте еще раз<br>";
}
?>
Вроде бы все достаточно просто. Но допустим, у нас не одна секретная страничка, а несколько. Причем они связаны между собой перекрестными ссылками. Тогда возникает необходимость постоянно помнить пароль и логин посетителя сайта (если он таковой имеет). Чтобы решить эту проблему, можно в каждую страницу встроить скрипт, который будет передавать логин и пароль от страницы к странице в качестве скрытых параметров формы. Но такой способ не совсем безопасен: эти параметры можно перехватить и подделать. В PHP существует более удобный и
Cессии - это механизм, который позволяет создавать и использовать переменные, сохраняющие свое значение в течение всего времени работы пользователя с сайтом.
Эти переменные для каждого пользователя имеют различные значения и могут использоваться на любой странице сайта до выхода пользователя из системы. При этом каждый раз, заходя на сайт, пользователь получает новые значения переменных, позволяющие идентифицировать его в течение этого сеанса или
Задача
Существует несколько способов передачи
С помощью
С помощью параметров адресной строки.
В этом случае
Например: адрес http://green.nsu.ru/test.php превращается в адрес http://green.nsu.ru/test.php?PHPSESSID=ac4f4a45bdc893434c95dcaffb1c1811
Этот способ передачи идентификатора используется автоматически, если у браузера, отправившего запрос, выключены
Кроме перечисленных вариантов передачи
Прежде чем начать работать с
Настройки PHP, в том числе и для работы с
Как мы уже знаем,
/tmp. И если в корневой директории сервера такой папки нет, то при запуске
Сервер может обрабатывать большое количество N;/dir. Это значение нужно обязательно взять в кавычки, поскольку точка с запятой является одним из символов комментариев в
Например: 2;/Temp определяет, что переменные c:\Temp\0\a\, c:\Temp\0\b\ и т.п.
Хранение данных на стороне клиента осуществляется с помощью
"1" )
"0", т.е. данные в
Кроме этих параметров, полезными могут оказаться
Имя PHPSESSID и используется в "1". Для кодирования данных
Существует еще множество настроек, с которыми можно познакомиться в документации или непосредственно в
Первое, что нужно сделать для работы с "0" (если , то
session_start();
Получив такую команду, сервер создает новую
Команду session_start() нужно вызывать во всех скриптах, в которых предстоит использовать переменные
Получить идентификатор текущей
Для наглядности . Делать это нужно еще до инициализации
Пример 12.2. Создание сессии
Переименуем наш файл index.html, чтобы обрабатывались
<?
session_start();
// создаем новую сессию или
// восстанавливаем текущую
echo session_id();
// выводим идентификатор сессии
?>
<html>
<head><title>My home page</title></head>
... // домашняя страничка
</html>
<?
echo session_name();
// выводим имя текущей сессии.
// В данном случае это PHPSESSID
?>
Если проделать то же самое с файлом authorize.php, то значения выводимых переменных (id
Однако от самих идентификатора и имени
session_register(имя_переменной1,
имя_переменной2, ...);
Заметим, что регистрируются не значения, а имена переменных. Зарегистрировать переменную достаточно один раз на любой странице, где используются $. Все зарегистрированные таким образом переменные становятся глобальными (т.е. доступными с любой страницы) в течение данной
Зарегистрировать переменную также можно, просто записав ее значение в ассоциативный
$_SESSION['имя_переменной'] =
'значение_переменой';
В этом массиве хранятся все зарегистрированные (т.е. глобальные) переменные
Доступ к таким переменным осуществляется с помощью массива $_SESSION['имя_переменной'] (или $HTTP_SESSION_VARS['имя_переменной'] для версии PHP 4.0.6 и более ранних). Если же в настройках php включена опция
Если (отключены), то пользоваться session_register() ; более того, начиная с версии PHP 6.0.0, эта функция станет недоступна. Вместо этого, для $_SESSION.)
Пример 12.3. Регистрация переменных
Зарегистрируем логин и пароль, вводимые пользователем на странице авторизации.
<?
session_start();
// создаем новую сессию или
// восстанавливаем текущую
if (!isset($_GET['go'])){
echo "<form>
Login: <input type=text name=login>
Password: <input type=password
name=passwd>
<input type=submit name=go value=Go>
</form>";
}else {
$_SESSION['login']=$_GET['login'];
// регистрируем переменную login
$_SESSION['passwd']=$_GET['passwd'];
// регистрируем переменную passwd
// теперь логин и пароль - глобальные
// переменные для этой сессии
if ($_GET['login']=="pit"
$_GET['passwd']=="123") {
Header("Location: secret_info.php");
// перенаправляем на страницу
// secret_info.php
}else echo "Неверный ввод,
попробуйте еще раз<br>";
}
print_r($_SESSION);
// выводим все переменные сессии
?>
Теперь, попав на страничку secret_info.php, да и на любую другую страницу сайта, мы сможем работать с введенными пользователем логином и паролем, которые будут храниться в
<?php
session_start();
// создаем новую сессию или
// восстанавливаем текущую
print_r($_SESSION);
// выводим все переменные сессии
?>
<html>
<head><title>Secret info</title></head>
<body>
<p>Здесь я хочу делиться секретами
с другом Петей.
</body>
</html>
То мы получим в браузере на секретной странице следующее:
Array ( [login] => pit [passwd] => 123 ) Здесь я хочу делиться секретами с другом Петей.
В итоге получим
Что это нам дает? Допустим, хакер хочет прочитать секреты Васи и Пети. И он как-то узнал, как называется секретная страничка (или странички). Тогда он может попытаться просто ввести ее адрес в строке браузера, минуя страницу авторизации (ввода пароля). Чтобы избежать такого проникновения в наши тайны, нужно дописать всего пару строк в код секретных страничек:
<?php
session_start();
// создаем новую сессию или
// восстанавливаем текущую
print_r($_SESSION);
// выводим все переменные сессии
if (!($_SESSION['login']=="pit"
$_SESSION['passwd']==123))
// проверяем правильность
// пароля-логина
Header("Location: authorize.php");
// если ошибка, то перенаправляем на
// страницу авторизации
?>
<html>
<head><title>Secret info</title></head>
... // здесь располагается
//секретная информация :)
</html>
Кроме умения регистрировать переменные
unset(). Она не возвращает никакого значения, а просто уничтожает указанные переменные.
Где это может пригодиться? Например, для уничтожения данных о посетителе (в частности, логина и пароля) после его ухода с секретной странички. Если правильные логин и пароль сохранятся и окно браузера после посещения сайта не закрыли, то любой другой пользователь этого компьютера сможет прочитать закрытую информацию.
Пример 12.4. Уничтожение переменных сессии
В файл secret_info.php добавим строчку для выхода на главную страницу:
<?php
// ... php код
?>
<html>
<head><title>Secret info</title></head>
... // здесь располагается
// секретная информация :)
<a href="index.php">На главную</a>
</html>
В Index.php уничтожим логин и пароль, введенные ранее:
<?
session_start();
session_unregister('passwd');
// уничтожаем пароль
unset($_SESSION['login']);
// уничтожаем логин
print_r($_SESSION);
// выводим глобальные переменные сессии
?>
<html>
<head><title>My home page</title></head>
... // домашняя страничка
</html>
Теперь, чтобы попасть на секретную страницу, нужно будет опять вводить логин и пароль.
Для того чтобы сбросить значения всех переменных
Уничтожить текущую
<?
session_start(); // инициализируем сессию
$test = "Переменная сессии";
$_SESSION['test']= $test;
// регистрируем переменную $test.
// если register_globals=on,
// то можно использовать
// session_register('test');
print_r($_SESSION);
// выводим все глобальные переменные
echo session_id();
// выводим идентификатор сессии
echo "<hr>";
session_unset();
// уничтожаем все глобальные
// переменные сессии
print_r($_SESSION);
echo session_id();
echo "<hr>";
session_destroy(); // уничтожаем сессию
print_r($_SESSION);
echo session_id();
?>
В результате работы этого скрипта будут выведены три строки: в первой - массив с элементом test и его значением, а также
Вообще говоря, cледует понимать, что использование механизма
Во-первых, опасно передавать туда-сюда пароль, его могут перехватить. Кроме того, мы зарегистрировали его как глобальную переменную my_user и паролем my_passwd.
Во-вторых, что делать, если кто-то написал скрипт подбора пароля для секретной страницы? В этом случае на страницу авторизации много раз должен стучаться какой-то посторонний скрипт. Поэтому нужно просто проверять, с нашего ли сайта пришел запрос на авторизацию, и если нет, то не пускать его дальше. Адрес страницы, с которой поступил запрос, можно получить с помощью глобальной переменной
<?
session_start();
// создаем новую сессию или
// восстанавливаем текущую
$conn = mysql_connect("localhost",
"my_user","my_passwd");
// устанавливаем соединение с сервером БД
mysql_select_db("test");
// выбираем рабочую базу данных
$SERVER_ROOT = "http://localhost/~nina/tasks/sessions/";
// где находятся наши скрипты
/* с помощью регулярного выражения
^$SERVER_ROOT и функции eregi проверяем,
начинается ли адрес ссылающегося скрипта,
т.е. строка $_SERVER['HTTP_REFERER'])
со строки $SERVER_ROOT (как у нас) */
if(eregi("^$SERVER_ROOT",
$_SERVER['HTTP_REFERER'])){
// если да, то делаем почти то же, что и
// раньше, пароль регистрировать не будем
if (!isset($_POST['go'])){
echo "<form method=POST >
Login: <input type=text name=login>
Password: <input type=password name=passwd>
<input type=submit name=go value=Go>
</form>";
}else {
/* запрос к базе данных: выбираем из таблицы
users login, который совпадает с переданным
по запросу, причем пароль у него тоже должен
совпасть с введенным пользователем.
Если этого нет, то считаем, что логин и
пароль введены неверно */
$sql = "SELECT login FROM users
WHERE login='" . $_POST['login'] . "' AND passwd='" . $_POST['passwd'] . "';";
$q = mysql_query($sql,$conn); // отправляем запрос к БД
$n = mysql_num_rows($q); // число строк в ответе на запрос
if (!$n==0){
$_SESSION['user_login']=$_POST['login'];
// регистрируем переменную login
Header("Location: secret_info.php");
// перенаправляем на страницу secret_info.php
}else echo "Неверный ввод, попробуйте еще раз<br>";
}
print_r($_SESSION); // выводим все переменные сессии
}
?>
Вроде бы первые две проблемы решены. Но есть еще одна. Что делать, если хакер просто допишет в строку запроса значение какой-нибудь глобальной переменной (например, логина)? Вообще это возможно, только если . Просто иначе мы используем для работы с глобальными переменными $user_login. Потом данную переменную нужно опять зарегистрировать, но не как новую, а как уже существующую. Для этого знак доллара при регистрации НЕ опускается. Вот что получилось:
<?php
unset($user_login); // уничтожаем переменную
session_start(); // создаем новую сессию или
// восстанавливаем текущую
session_register($user_login);
// регистрируем переменную
// как уже существующую
if (!($user_login=="pit")) // проверяем логин
Header("Location: authorize.php");
// если ошибка, то перенаправляем
// на страницу авторизации
?>
<html>
<head><title>Secret info</title></head>
... // здесь располагается
// секретная информация :)
</html>
Итак, мы познакомились с
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.