Почти все, что создается с помощью PHP, работает в сетевой среде. Первоначально этот язык был представлен как средство создания HTML-документов с использованием протокола HTTP. PHP позволяет кодировать так, что вам не нужно думать о протоколах нижнего уровня, но он также позволяет вам по необходимости работать и с этими протоколами. В этой главе речь пойдет о двух важных протоколах, HTTP и SMTP, которые предназначены для передачи Web-документов и электронной почты. В данной главе описывается несколько общих проблем и предлагаются способы их решений. Кроме того, вы узнаете о защите Web-страниц с помощью основной HTTP-аутентификации и о том, как использовать HTTP-заголовки и осуществлять обмен данными с удаленными серверами.
24.1. HTTP-аутентификация
Опыт работы с Web-приложениями обязательно дает опыт работы с HTTP-аутен-тификацией. Вы запрашиваете страницу, и появляется небольшое окно, запрашивающее имя пользователя и его пароль. Как вы узнали в главе 9, "Операционная система", для открытия URL в PHP используется функция fopen. Имя и пароль можно задать в URL так же, как и в окне location браузера Navigator. Аутентификация осуществляется с помощью HTTP-заголовков, а защитить PHP-страницы можно с помощью функции header.
Для защиты страницы с помощью основной HTTP-аутентификации необходимо отправить два заголовка. Заголовок WWW-Authenticate сообщает браузеру о том, что требуется ввод имени пользователя и пароль, и определяет область, группирующую страницы. Имя пользователя и его пароль будут соответствовать всей группе, поэтому пользователям не требуется аутентифицировать себя при каждом обращении к страницам из этой группы. Другим заголовком является status, который должен иметь значение HTTP/1.0 4 01 Unauthorized. Сравните его с таким обычным заголовком, как HTTP/1.0 2 00 OK.
В листинге 24.1 приведен пример защиты одной страницы. HTML-код, предназначенный для создания страницы, объединен в функции, так как он должен сообщать об успешном завершении аутентификации. PHP автоматически создает элементы PHP_AUTH_USER и PHP_AUTH_PW массива _SERVER, если браузер передает имя пользователя и его пароль. В данном примере - это пользователь leon и пароль secret. Более сложная схема предполагает сравнение имени пользователя и его пароля с данными, хранящимися в файле или базе данных.

Листинг 24.1. Запрос аутентификации

<?php /*
** Определение функций, предназначенных для ** начала и окончания HTML-документа
*/
function startPage() {
print("<html>n"); print("<head>n");
print("<title>Листинг 24.1</title>n"),-
print("</head>n");
print("<body>n");
}
function endPage()
{
print("</body>n");
print("</html>n");
}
/*
** проверка имени пользователя и его пароля
*/
if(($_SERVER['PHP_AUTH_USER'] == "leon") AND ($_SERVER['PHP_AUTH_PW] == "secret"))
{
startPage();
print("Успешная регистрация!<br>n"); endPage();
}
else
{
//Отправить заголовки, чтобы браузер //запросил имя и пароль пользователя header("WWW-Authenticate: " .
"Basic realm="Leon's Protected Area"");
header("HTTP/1.0 401 Unauthorized");
//Отобразить текст ошибки, который браузер обычно //отображает после нескольких ошибочных попыток регистрации print("Эта страница защищена HTTP-аутентификацией " .
".^^^Работайте как пользователь <b>leon</b> " .
", с паролем <b>secret</b>" .
".<br>n");
}
?>