Защита сайта через HTTP аутентификацию

Для того чтобы защитить свой сайт от несанкционированного доступа есть много способов: Один из них — это HTТP аутентификация. Выглядит это так: когда вы заходите в запрещенную зону, то видите обычное виндовое окошко с просьбой ввести логин и пароль.
Способов генерации таких окошек два: первый надежный и беспроблемный, второй более гибкий, но и более трудоемкий. и менее надежный.

Способ 1.

В директорию, которую вы хотите защитить заливаете файл .htaccess со следующими строками:

AuthType Basic
AuthName "Private zone"
AuthUserFile  /usr/host/mysite/.htpasswd

Немного поясню директивы
AuthType — Тип используемой аутентификации. Для базовой аутентификации эта директива должна иметь значение: Basic
AuthName — Имя области действия аутентификации. Текст, помогающий посетителю понять, куда он пытается получить доступ. Например, может быть написано: «Private zone.»
AuthUserFile — путь к файлу с паролями (.htpasswd).

Далее, если у вас установлен apache, находим в директории bin утилитку htpasswd и выполняем следующую команду:

htpasswd -cm .htpasswd admin

-cm — это ключи для утилиты. Ключ с — указывает, что необходимо создать новый файл с паролями. Если файл с таким именем уже существует, то он будет перезаписан. Ключ m — определяет шифрование по алгоритму MD5.
.htpasswd — имя файла с вашим паролем.
admin — имя посетителя, которому будет разрешен доступ и для которого мы сгенерируем пароль.
Далее, вам понадобится дважды ввести пароль. После этого всего файл сгенерируется. Заливаем его в директорию, указанную в директиве AuthUserFile. Обратите внимание, что путь должен быть абсолютным, относительные не будут работать.

Минусами этого способа является то, что для того, чтобы изменить пароль придется генерировать его заново, перезаписывать файл. ИЗ плюсов надежность.

Второй способ

Его мы реализуем при помощи php.
Делаем проверку, авторизован пользователь или нет. Если нет, то запрашиваем пароль и логин

if (!isset($_SESSION['Auth']))
{
Header("WWW-Authenticate: Basic realm=Login");
Header("HTTP/1.0 401 Unauthorized");
die();
}
// --- end auth section

Перед этими строками пишем саму проверку, введены ли данные и правильны ли они:

if (isset($_GET['logout']) && $_SESSION['logout'] == false)
{
	unset($_SESSION['Auth']);
	$_SERVER['PHP_AUTH_USER'] = "";
	$_SERVER['PHP_AUTH_PW'] = "";
	$_SESSION['logout'] = true;
} 

elseif (isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW']))
{
	if ($_SERVER['PHP_AUTH_USER'] == "admin"  && $_SERVER['PHP_AUTH_PW'] == "12345")
	{
		$_SESSION['Auth'] = true;
		$_SESSION['logout'] = false;
	}
}

В данном примере данные будут доступны пользователю admin с паролем 12345.

Теперь особеность работы с сервером, где php работает как cgi. Данная информация, кстати пригодится всем, кто работает с парнеркой glavtorg.
Что подружить cgi со вторым спосбо делаем следующее.

  1. В файл .htaccess добавляем следующую строку:
    RewriteRule admin/.* - [E=REMOTE_USER:%{HTTP:Authorization},L]

    admin — это защищаемая папка.

  2. Перед нашим, приведенным выше php-кодом пишем следующее:
    list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) =
    explode(':', base64_decode(substr($_SERVER['REMOTE_USER'], 6)));

Что нам дадут эти манипуляции и для чего они?! Просто у php работающего как CGI напрочь отсутствуют такие параметры как $_SERVER[‘PHP_AUTH_USER’] и $_SERVER[‘PHP_AUTH_PW’], а вводимые нами данные, мы, используя, то, что написано в пункте 1 складываем в $_SERVER[‘REMOTE_USER’] через двоеточие, зашифрованные алгоритмом base64.
Из минусов этого спосба: в каждом файле защищаемой директории нужно проверять переменную $_SESSION[‘Auth’]. Из плюсов то, что пароль легче менять.
[ad name=»Adsense»]

Защита сайта через HTTP аутентификацию: 7 комментариев

  1. Базовая авторизация не безопасна — в случае перехвата заголовков (предположим пиратский прокси) можно получить доступ к сайту. Более надежным является дайджест авторизация — в случае перехвата доступ ограничен временем жизни временного ключа (можно вообще одноразовые ключи), ну в реализации дайджест авторизация гораздо сложнее. В свое время я затрахался отлаживать дайджест авторизацию в php на разных конфигах php, особено как модуля cgi

    • Я если честно вообще не сторонник CGI, но, видимо что-то в этом есть, не вдавался в подробности никогда

  2. Я тоже не преверженец .htaccess авторизации…
    Согласен с Блоголётчик по поводу перехвата заголовков..
    Не скажу что реализации дайджест авторизации столько сложна, может относительно .htaccess авторизации.
    За то можно избавится от множетва заморочев в будущем…

  3. Зачем везде проверять, когда можно создать файл htpasswd.php со вторым способом и подключить его ко всем файлам сайта (админки) через .htaccess

  4. Зачем редактировать? В .htaccess подключить файл htpasswd.php, используя дериктиву, auto_prepend_file.

    • Стыдно признаться, но я такого способа не знал 🙁 спасибо, что подсказали

Обсуждение закрыто.