Материал предоставлен https://it.rfei.ru

Начало сессии

Для того чтобы инициировать работу сессии, нужно перед выводом на экран любого кода HTML вызвать PHP-функцию sessionstart точно так же, как это делалось при отправке cookie в процессе обмена заголовками. Затем, чтобы приступить к сохранению переменных сессии, им нужно присвоить значения как элементам массива $_SESSION:

$_SESSION['имя_переменной'] = $переменная_со_значением;

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

$имя_переменной = $_SESSION['имя_переменной'];

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

Все необходимые изменения показаны в следующем примере. Единственное отличие касается раздела if($token — $row[3]), который теперь начинается с открытия сессии и сохранения в ней четырех переменных. Наберите код этой программы (или измените код предыдущего примера) и сохраните его в файле authenticate2.php. Но пока не запускайте эту программу в браузере, поскольку нужно будет создать еще и вторую программу.

Пример. Открытие сессии после успешной аутентификации

<?php // authenticate2.php
require_once 'login.php';
$db_server = mysql_connect($db_hostname, $db_username, $db_password);
if (!$db_server) die("Unable to connect to MySQL: " . mysql_error());
mysql_select_db($db_database)
	or die("Unable to select database: " . mysql_error());

if (isset($_SERVER['PHP_AUTH_USER']) &&
	isset($_SERVER['PHP_AUTH_PW']))
{
	$un_temp = mysql_entities_fix_string($_SERVER['PHP_AUTH_USER']);
	$pw_temp = mysql_entities_fix_string($_SERVER['PHP_AUTH_PW']);

	$query = "SELECT * FROM users WHERE username='$un_temp'";
	$result = mysql_query($query);
	if (!$result) die("Database access failed: " . mysql_error());
	elseif (mysql_num_rows($result))
	{
		$row = mysql_fetch_row($result);
		$salt1 = "qm&h*";
		$salt2 = "pg!@";
		$token = md5("$salt1$pw_temp$salt2");

		if ($token == $row[3])
		{
			session_start();
			$_SESSION['username'] = $un_temp;
			$_SESSION['password'] = $pw_temp;
			$_SESSION['forename'] = $row[0];
			$_SESSION['surname']  = $row[1];
			echo "$row[0] $row[1] : Hi $row[0],
				you are now logged in as '$row[2]'";
			die ("<p><a href=continue.php>Click here to continue</a></p>");
		}
		else die("Invalid username/password combination");
	}
	else die("Invalid username/password combination");
}
else
{
	header('WWW-Authenticate: Basic realm="Restricted Section"');
	header('HTTP/1.0 401 Unauthorized');
	die ("Please enter your username and password");
}

function mysql_entities_fix_string($string)
{
	return htmlentities(mysql_fix_string($string));
}

function mysql_fix_string($string)
{
	if (get_magic_quotes_gpc()) $string = stripslashes($string);
	return mysql_real_escape_string($string);
}
?>

К программе также добавлена ссылка «Щелкните здесь для продолжения» с URL-адресом continue.php. Она будет использована для иллюстрации того, как сессия будет перенесена на другую программу или веб-страницу PHP-программы. Поэтому создайте файл continue.php, набрав и сохранив в нем программу из следующего примера.

Пример. Извлечение переменных сессии

<?php // continue.php
session_start();

if (isset($_SESSION['username']))
{
   $username = $_SESSION['username'];
   $password = $_SESSION['password'];
   $forename = $_SESSION['forename'];
   $surname = $_SESSION['surname'];
   echo "С возвращением. $forename,<br/>
Ваше полное имя $forename $surname,<br/>
Ваше имя пользователя '$username'
и Ваш пароль '$password'.";
}
else echo "Пожалуйста, для входа <а href=authenticate2.php>щелкните здесь</а>.";
?>

Теперь можно вызвать в браузере authenticate2.php, после появления приглашения ввести имя пользователя bsmith и пароль mysecret (или pjones и acrobat) и щелкнуть на ссылке для загрузки программы continue.php. Когда браузер вызовет эту программу, появится результат, аналогичный показанному на рисунке.

Поддержка пользовательских данных с помощью сессий

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

В следующем ниже примере быстрой проверки наличия значения у элемента $_SESSION ['username'] вполне достаточно для того, чтобы узнать об аутентификации текущего пользователя, потому что переменные сессии хранятся на сервере (в отличие от cookie, которые хранятся на машине веб-браузера) и им можно доверять.

Если элементу $_SESSION['username'] значение присвоено не было, значит, активная сессия отсутствует, и поэтому последняя строка кода в данном примере перенаправляет пользователей на страницу регистрации на сайте, которая находится в программе authenticate2.php.

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

Использование сессийЗавершение сессии