Статьи

HTTP-аутентификация Apache с помощью PHP

В то или иное время нам всем приходилось заходить на защищенный паролем веб-сайт. При создании сайта вы можете решить потребовать этого от ваших посетителей по нескольким причинам. Первая и наиболее очевидная — это защита защищенной информации, чтобы ее могли просматривать только немногие избранные. Но вы также можете назначить имена пользователей и пароли случайным посетителям. Это может быть сделано для отслеживания того, кто просматривает ваш сайт, или для предоставления персонализированных опций и услуг вашим посетителям.

Самый простой способ защитить паролем сайт — это использовать HTTP-аутентификацию, при которой, если запрос браузера на защищенную страницу не сопровождается правильными именем пользователя и паролем, веб-сервер отвечает с ошибкой HTTP 401 — что означает «Несанкционированный». Доступ »- и приглашение для браузера повторно отправить запрос с правильным именем пользователя и паролем. С точки зрения пользователя, большая часть этого диалога скрыта. После этого первого неудачного запроса браузер запрашивает у пользователя (в диалоговом окне) имя пользователя и пароль, а затем повторно отправляет запрос, на этот раз с приложенной информацией аутентификации. Предполагая, что комбинация имени пользователя и пароля находится в списке разрешенных пользователей, веб-сервер затем отправляет запрошенную страницу. Веб-браузер также продолжит отправлять это имя пользователя / пароль со всеми последующими запросами.

Наиболее распространенный способ настройки схемы HTTP-аутентификации — использование файла Apache «htaccess» (см. Http://hoohoo.ncsa.uiuc.edu/docs/tutorials/user.html ), но этот метод имеет недостатки. Создание динамического списка авторизованных пользователей (например, чтобы пользователи могли зарегистрироваться и получить немедленный доступ к вашему сайту) может потребовать некоторых довольно извращенных серверных сценариев, которые должны будут манипулировать файлами htaccess для добавления и удаления пользователей. по мере необходимости. И вести любые записи о том, кто имеет доступ к тому, что с использованием каких комбинаций имени пользователя и пароля практически невозможно, используя базовую поддержку HTTP-аутентификации на большинстве веб-серверов.

Введите PHP, бесплатный кроссплатформенный серверный язык сценариев с открытым исходным кодом. При установке в качестве модуля Apache (это не будет работать с версиями CGI и ISAPI), PHP позволяет самостоятельно обрабатывать HTTP-аутентификацию, используя любые средства, которые вам нравятся, чтобы определить, принимать или запрещать доступ к веб-сайту.
С этого момента я предполагаю, что вы знакомы с основами PHP. Если этот язык является новым для вас, или если вам нужен переподготовка, часть 3 моей серии « Создание веб-сайта на основе базы данных » должна помочь вам освоиться.

При установке в качестве модуля Apache PHP предоставляет две специальные глобальные переменные: $PHP_AUTH_USER$PHP_AUTH_PW Они содержат имя пользователя и пароль, которые сопровождали текущий HTTP-запрос, соответственно. Используя функцию header()

Давайте рассмотрим пример кода для страницы, которую можно просматривать, только если пользователь вводит имя пользователя "myuser""mypass"

 <?php  
if ($PHP_AUTH_USER != "mysuser"  
   or $PHP_AUTH_PW != "mypass"):  
 // Bad or no username/password.  
 // Send HTTP 401 error to make the  
 // browser prompt the user.  
 header("WWW-Authenticate: " .  
        "Basic realm="Protected Page: " .  
        "Enter your username and password " .  
        "for access."");  
 header("HTTP/1.0 401 Unauthorized");  
 // Display message if user cancels dialog  
 ?>  
 <HTML>  
 <HEAD><TITLE>Authorization Failed</TITLE></HEAD>  
 <BODY>  
 <H1>Authorization Failed</H1>  
 <P>Without a valid username and password,  
    access to this page cannot be granted.  
    Please click 'reload' and enter a  
    username and password when prompted.  
 </P>  
 </BODY>  
 </HTML>  
<?php else: ?>  
 ...page contents here...  
<?php endif; ?>

Как видите, проверить введенные имя пользователя и пароль так же просто, как проверить переменные $PHP_AUTH_USER$PHP_AUTH_PW При обнаружении неправильной комбинации пользователь / пароль вы отвечаете двумя заголовками HTTP (используя функцию header

 WWW-Authenticate: Basic realm="Prompt the user here."  
HTTP/1.0 401 Unauthorized

Первая строка сообщает веб-браузеру, что должна использоваться обычная аутентификация. Это просто означает, что аутентификация должна выполняться с использованием имени пользователя и пароля. Опция realm позволяет браузеру знать, когда следует использовать определенное имя пользователя / пароль при навигации по группе веб-страниц. Все страницы, которые должны использовать одно и то же имя пользователя / пароль (таким образом, избавляя пользователя от необходимости повторно вводить их для каждой страницы), должны иметь одну и ту же заданную область. Поскольку эта строка отображается в диалоговом окне, предлагающем пользователю, это идеальное место для размещения сообщения (например: «Если вы новый пользователь, введите« гость »в качестве имени пользователя и оставьте пароль пустым».). Обратите внимание, что двойные кавычки в этой строке необходимо экранировать с помощью обратной косой черты, чтобы они не мешали двойным кавычкам, окружающим строку в вашем PHP-коде.

Вторая строка — это стандартный код ответа HTTP, который позволяет браузеру узнать, что введенные имя пользователя / пароль (если они есть) были неправильными, и что пользователю следует предложить ввести их повторно.

Чтобы защитить весь сайт, вы обычно используете функцию include

Недавно я использовал эту технику на сайте, который я создал для небольшой группы людей, работающих над проектом вместе. Я выпустил одну комбинацию имени пользователя и пароля, которая дала им доступ к странице регистрации, где каждая из них создала бы персональную комбинацию имени пользователя и пароля. На странице регистрации эти комбинации будут храниться в базе данных MySQL (дополнительную информацию см. В серии статей « Создание веб-сайта на основе базы данных »). Все остальные страницы на сайте будут затем обращаться к этой базе данных, чтобы определить, разрешено ли заданному сочетанию имени пользователя и пароля доступ к сайту или нет.

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