На главнуюПользователиНовые сообщенияОбратная связь
DGR.Su - Компьютерный форум: Архив IT, мобильная связь, радиотехника Вебстроительство Разработка сайтов

.htaccess и .htpasswd

Spirit 08.12.2008, 11:33
.htaccess и .htpasswd - защита сайта базовыми средствами Apache

Защита сайта средствами самого сервера Apache является одним из самых простых и в тоже время достаточно надежных способов. В этом случае Вам не нужно досконально продумывать стратегию безопасности, осуществлять ее проектирование и реализацию в коде. К тому же, для того, чтобы создать хорошую систему защиты нужно обладать достаточной квалификацией в этом вопросе. Используя встроенную защиту WEB-сервера Apache, Вы значительно упрощаете себе задачу — все, что Вы должны сделать — это выполнить несложную последовательность действий и Ваш сайт будет в достаточной мере защищен. В данной статье будут подробно описаны шаги и действия, которые Вам необходимо совершить. А в конце статьи будут приведены примеры файлов .htaccess.
Базовая аутентификация

В данной статье будет рассмотрен самый простой и доступный способ защиты — базовая аутентификация средствами Apache.

Замечание:
Аутентификация — процесс, с помощью которого проверяется, что некто является именно тем, за кого он себя выдает. Как правило, проверка включает в себя ввод имени и пароля.

Рассмотрим, как работает базовая аутентификация.
При обращении посетителя в защищаемую директорию, сервер Apache в ответ на запрос посылает заголовок с кодом 401 (401 authentication required header). Браузер посетителя принимает заголовок с кодом 401 и выводит окно с полями для ввода имени пользователя и пароля. После ввода имени и пароля эти данные отсылаются назад серверу, который проверяет имя пользователя на предмет нахождения в специальном списке, а пароль на правильность. Если все верно, то посетитель получает доступ к ресурсу. Вместе с заголовком браузеру посылается специальной имя, называемое областью действия. Браузер кэширует не только имя и пароль, чтобы передавать их при каждом запросе, но и область действия. Благодаря этому, ввод имени и пароля в защищаемой директории осуществляется только раз. В противном случае их необходимо было бы вводить при каждом запросе к защищаемой директории. Кэширование параметров аутентификации (имя, пароль, область действия), обычно осуществляет только в пределах одного сеанса.

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

Замечание:
WEB-сервер Apache поддерживает еще один вид защиты — digest-аутентификацию. При digest-аутентификации пароль передается не в открытом виде, а в виде хеш-кода, вычисленному по алгоритму MD5. Поэтому пароль не может быть перехвачен при сканировании трафика. Но, к сожалению, для использования digest-аутентификации необходимо установить на сервер специальный модуль - mod_auth_digest. А это находится только в компетенции администрации сервера. Также, до недавнего времени, digest-аутентификация поддерживалась не всеми видами браузеров.

Защита сайта — это просто

Для того чтобы защитить сайт, нужно выполнить следующую последовательность действий: создать файл с паролями, переписать его на сервер, создать файл .htaccess и тоже переписать его на сервер.
Для организации защиты понадобится:

1. WEB-сайт и FTP-доступ к нему.
2. Права на создание файлов .htpaccess и организацию защиты с помощью них.
3. Утилита генерации паролей htpasswd.exe

Проверка работы файла .htaccess на сервере

Для того, чтобы проверить, есть ли у Вас права на организацию защиты с помощью файлов .htaccess, создайте текстовый файл с именем .htaccess (первым символом идет точка, расширение отсутствует).

Замечание:
Удобно создавать файлы .htaccess с помощью встроенного редактора в оболочках Far, WindowsCommander, TotalCommander и т.п., а также в редакторе Блокнот.

Замечание:
Чтобы блокнот не подставлял автоматически расширение txt, в диалоге сохранения в выпадающем списке "тип файла" следует выбрать опцию "Все файлы".

Перед тем как сохранить файл, впишите в него следующие строки:
Проверка работы .htaccess

AuthType Basic
AuthName admin
require valid-user

Затем, через FTP-доступ, перепишите файл .htaccess на сайт, в ту директорию, которую вы хотите защитить.

Замечание:
Действие файлов .htaccess распространяется не только на ту директорию, где лежит файл, но и на все поддиректрии, лежащие уровнем ниже.

Далее через браузер обратитесь к этой директории. Если Вы защищаете директорию admin и переписали туда файл .htaccess, то для проверки Вам следует вписать в адресную строку браузера следующий URL: ....

Если после этого Вам открылся запрос на ввод логина и пароля, как на рисунке ниже, то тестирование прошло успешно и можно продолжать защиту директории.
попытка обращения к сайту, защищенному .htaccess и запрос пароля (аутентификация Apache)


Если вы все сделали правильно, но окошко ввода пароля не появилось, то это значит, что настройки сервера запрещают Вам использовать файлы .htaccess для защиты директорий. Для решения данного вопроса Вам следует связаться с администрацией сервера, либо использовать другой тип защиты.
После того, как было выяснено, что файлы .htaccess работают, следует удалить с сайта только что написанный тестовый файл.

Замечание:
Если по каким либо причинам Вы не можете удалить файл .htaccess, то создайте пустой файл .htaccess и замените им файл, лежащий на сервере.


Создание файла с паролями .htpasswd

Файл с паролями создается утилитой htpasswd.exe. Если у Вас на машине установлен WEB-сервер Apache, то данная утилита находится в директории с установленным Apache-ем в подкаталоге bin.

Замечание:
Если у Вас не установлен Apache, то утилиту htpasswd.exe можете скачать по ссылке: htpasswd.zip. ....

Для работы с утилитой htpasswd.exe необходим интерфейс работы с командной строкой. Интерфейсом работы с командной строкой обладают такие программы как Far, WindowsCommander и т.п. Здесь будет рассмотрена работа с командной строкой с помощью утилиты cmd, которая входит в поставку Windows 2000/XP и т.п.
Нажмите "Пуск"->"Выполнить", введите в строку ввода cmd и нажмите ОК. Вам откроется окно утилиты CMD.




Далее необходимо перейти в директорию, где находится утилита htpasswd.exe. Допустим, сервер Apache установлен в директории с:/Apache2, тогда введите в командную строку команду: cd../../apache2/bin и нажмите ввод.



Вы перешли в директорию Apache/bin. Теперь нужно дать команду на создание файла с паролем. Введите в командную строку следующее:

htpasswd -cm .htpasswd admin

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

В ответ, должен появится запрос на ввод пароля и его повтор. Если все правильно, то в завершении появится сообщение: Adding password for user admin. И в директории Apache/bin появится файл .htpasswd, к котором будет находиться строка с именем пользователя и хеш-кодом его пароля. Для того, что бы в тот же файл .htpasswd добавить еще одного пользователя следует убрать ключ -c из команды запуска утилиты htpasswd.exe

htpasswd -m .htpasswd admin


Замечание:
Если файл с паролями не был создан, то возможно, некоторые ключи утилиты не поддерживаются в Вашей операционной системе. Например, иногда не поддерживается ключ m. В этом случае, Вам нужно ввести htpasswd -c .htpasswd admin
Для того, чтобы посмотреть ключи и параметры работы утилиты введите htpasswd.exe /? Вам будет выдано описание интерфейса.

Итак, файл с паролями создан. Теперь Вам необходимо переписать его на сервер. Файлы с паролями очень желательно класть выше корневой директории сайта — туда, куда не будет доступа посетителям.
Если это невозможно, то файлы с паролями следует обязательно защитить. Это можно сделать с помощью файлов .htaccess. Чтобы защитить файлы с паролями создайте файл со строками, представленными в следующем листинге.
Защита файлов .htpasswd

<Files .htpasswd>
deny from all
</Files>


И положите его в ту директорию, где находится Ваш файл с паролями. Теперь посетители сайта не смогут получить к нему доступ.
Файл с паролем создан и защищен от несанкционированного доступа. Теперь необходимо создать файл .htaccess, который будет использоваться в защищаемой директории.
Создание файла .htaccess

Для защиты директории могут использоваться следующие директивы:

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

Пример файла .htaccess

AuthType Basic
AuthName "Private zone. Only for administrator!"
AuthGroupFile /usr/host/mysite/group
AuthUserFile /usr/host/mysite/.htpasswd
require group admins

Следует более подробно описать директивы AuthUserFile и AuthGroupFile. В них прописываются абсолютные пути к соответствующим файлам от корня сервера.

Внимание!
Относительные пути работать не будут!

Путь от корня сервера, можно узнать, спросив у администрации сервера, либо можно попробовать выяснить его самим. Для этого выполните функцию phpinfo(). На экран будет выведена фиолетовая таблица. Значение абсолютного пути от корня сервера можно посмотреть в переменных: doc_root, open_basedir, DOCUMENT_ROOT.
Директива Require определяет кому разрешен доступ к закрытой области. Например,

* require valid-user — разрешен доступ всем прошедшим проверку
* require user admin alex mango — разрешен доступ только посетителям с именами admin, alex, mango. Естественно, они должны пройти аутентификацию.
* require group admins — разрешен доступ всем пользователям из группы admins

Файлы групп

Если к защищаемой области сайта должна иметь доступ большая группа людей, то удобно объединить людей в группы, и разрешать доступ, определяя принадлежность посетителя к группе.
Формат файла групп очень прост. Это текстовый файл, каждая строка, которой описывает отдельную группу. Первым в строке должно идти название группы с двоеточием. А затем через пробел перечисляются посетители, входящие в группу.
Пример файла групп

Admins: admin alex mango
Users: guest user max23

В группу Admins входят посетители с именами admin, alex, mango. А группу Users входят посетители с именами guest, user, max23.
Примеры файлов .htaccess
Доступ всем пользователям, прошедшим авторизацию

AuthType Basic
AuthName "Private zone. Only for administrator!"
AuthUserFile /usr/host/mysite/.htpasswd
require valid-user
Доступ только пользователям admin и root

AuthType Basic
AuthName "Private zone. Only for administrator!"
AuthUserFile /usr/host/mysite/.htpasswd
require user admin root
Доступ только пользователей из группы admins

AuthType Basic
AuthName "Private zone. Only for administrator!"
AuthUserFile /usr/host/mysite/.htpasswd
AuthGroupFile /usr/host/mysite/group
require group admins
Запрет доступа только к файлу private.zip

<Files private.zip>
AuthType Basic
AuthName "Private zone. Only for administrator!"
AuthUserFile /usr/host/mysite/.htpasswd
require valid-user
</Files>
Spirit 08.12.2008, 11:43
Примеры использования .htaccess:

Управление доступом

Директива Deny запрещает доступ к ресурсам, Allow - разрешает.
Директива Order служит для установки порядка работы с Deny и Allow.

Запрет на отображение всех файлов
Order Deny,Allow
Deny from all

Разрешение на отображение всех файлов
Order Allow, Deny
Allow from all

Запрет на конкретный файл
<Files "index.php">
Order Deny,Allow
Deny from all
</Files>

Разрешение на конкретный файл
<Files "index.php">
Order Allow,Deny
Allow from all
</Files>

Запрет на доступ только с определенного ip-адреса
Order Allow,Deny
Allow from all
Deny from 123.456.789.0
Deny from site.ru

В итоге будет запрещен доступ для посетителей, пришедших с ip-адреса 123.456.789.0 и с хоста site.ru, а для всех других посетителей доступ будет открыт.

Вместо ip-адреса также можно указать диапазон:
Deny from 123.456.789
В этом случае доступ будет запрещен для всех посетителей из сети класса C 123.456.789.0/24

Разрешение на доступ только с определенного ip-адреса
Order Deny,Allow
Deny from all
Allow from 123.456.789.0
Allow from site.ru
В данном примере, наоборот, устанавливается запрет для всех посетителей, кроме пришедших с ip-адреса 123.456.789.0 и с домена site.ru. Как и в случае с запретом, можно указывать не конкретный ip-адрес, а его диапазон, то есть 123.456.789

Запрет на группу файлов
<Files "\.(inc|sql|php|html)$">
Order Allow,Deny
Deny from all
</Files>
В строке <Files "\.(inc|sql|php|html)$"> перечисляются маски файлов, для которых закрыть доступ.

Перенаправления

Директивы: Redirect, RedirectMatch
Redirect – служит для осуществления редиректа на другой сайт (url).
Синтаксис: Redirect [status] path url
[status] – необязательное поле, определяющее код возврата. Существующие значения: permanent (301 — документ перемещен постоянно), temp (302 — документ перемещен временно), seeother (303 — смотрите другой), gone (410 — убран).
path – локальная часть запрашиваемой ссылки
url – ссылка, куда осуществляется редирект (перенаправление).

Пример:
Redirect / ....
Redirect /test.php ....
В данном примере всем запросившим страницу test.php будет открываться ....
Так, например, при запросе welcome.html будет переадресация на ....

Директива RedirectMatch аналогична директиве Redirect , за исключением того, что в параметры указывается шаблон локальных страниц в виде регулярных выражений. Например:
RedirectMatch (.*)\.php$ ....
RedirectMatch (.*)\.jpg$ ....

Можно сделать перенаправление в зависимости от ip-адреса посетителя:
RewriteCond %{REMOTE_ADDR} 12.345.67.89
RewriteRule ^/$ /errors.html [L]
В данном примере всем посетителям, пришедшим с ip-адреса 12.345.67.89 будет открываться страница errors.html.
Вы можете указать несколько ip-адресов, и для каждого определить свое правило перенаправления:
RewriteCond %{REMOTE_ADDR} 12.345.67.89
RewriteRule ^/$ /welcome.html [L]
RewriteCond %{REMOTE_ADDR} 123.45.67.89
RewriteRule ^/$ /close.html [L]
RewriteCond %{REMOTE_ADDR} 98.765.43.21
RewriteRule ^/$ .... [L]

В итоге всем посетителям, пришедших с адреса 12.345.67.89 будет открываться страница welcome.html, посетителям с ip-адреса 123.45.67.89 откроется close.html, а все пришедшие с адреса 98.765.43.21 будут перенаправлены на сайт www.site.ru.
Приведенные правила могут быть различаться на разных серверах, в зависимости от его конфигурации.
При необходимости определить переадресацию для группы ip-адресов, следует:
RewriteEngine On
RewriteCond %{REMOTE_ADDR} 12.345.67.89 [OR]
RewriteCond %{REMOTE_ADDR} 98.765.43.21
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /welcome.html [L]
В приведенном примере все посетители с ip-адресов 98.765.43.21 и 12.345.67.89 будут переадресовываться на страницу welcome.html

Так же можно сделать перенаправление в зависимости от той страницы, с которой пришел посетитель:
RewriteCond %{HTTP_REFERER} ....
RewriteRule ^/welcome.html$ /errors.html [L]
В этом примере всем посетителям, пришедшим с адреса .... вместо страницы welcome.html будет открываться страница errors.html.

Перенаправления для различного рода вирусов и сканеров:
redirect /_vti_bin ....
redirect /scripts ....
redirect /MSADC ....
redirect /c ....
redirect /d ....
redirect /_mem_bin ....
redirect /msadc ....
RedirectMatch (.*)\cmd.exe$ .... $1


Смена кодировки

Для указания кодировки отдаваемых файлов и страниц служит директива CharsetDefault.
AddDefaultCharset windows-1251 (или utf-8, koi8-r)
Для указания кодировки загружаемых файлов и страниц служит директива CharsetSourceEnc.
CharsetSourceEnc windows-1251 (или utf-8, koi8-r)

Обработка ошибок web-сервера

Иногда в работе сайта возникают какие-либо ошибки, указывающие, например, на отсутствие индексного файла, ограничение доступа, ошибки в скриптах. В этом случае посетитель видит стандартное сообщение web-сервера, но Вы можете установить свои страницы ошибок с фирменным дизайном или же рекламой сайта. Часто встречающиеся ошибки: 403, 404 и 500.
403 ошибка говорит то том, что установлен запрет на доступ к каталогу (Forbidden), либо пользователь не прошел авторизацию;
404 - запрашиваемый документ (файл, директория) не найден (Not Found);
500 - внутренняя ошибка сервера - ошибка скрипта или ошибка в синтаксисе файла .htaccess - (Internal Server Error).
Для того, чтобы посетителю были показаны Ваши сообщения об ошибках, в файл .htaccess следует прописать:
ErrorDocument 403 /error403.html
ErrorDocument 404 /error404.html
ErrorDocument 500 /error500.html
При этом, скажем, при возникновении ошибки 500 посетителю откроется страница error500.html.

Выполнение php-кода в html-документах

Для выполнения php-кода в html-документах следует прописать в файле .htaccess расширения файлов, в которых нужно выполнять php-код:
RemoveHandler .html .htm
AddType application/x-httpd-php .php .htm .html .phtml
Омен 19.12.2008, 20:54
чето я не могу разобраться с .htpasswd, точнее с пУтем К нему, пишу:AuthType Basic
AuthName "Private zone. Only for administrator!"
AuthUserFile /www/FoRUm/paSS/.htpasswd
require user admin rootпотом ИДУ В АДмИнКУ Ввожу лоГИн И пАсс Из .htpasswd Жму оК А он не считывает пАсс =( подскажите может я че не правильно Делаю =(
KOMATOZZ 20.12.2008, 08:58
сдклай блин папкам название нормальное....ппц как 12летний прямо...
а зачем идти в админку, если ты ставишь логин-пароль на папку paSS?
Омен 20.12.2008, 10:27
сдклай блин папкам название нормальное....ппц как 12летний прямо...
а зачем идти в админку, если ты ставишь логин-пароль на папку paSS?
мде... пароль я ставлю на админку через .htaccess, и даже если файл с пассами копирнуть в папку админки то все равно не робит, и при чем тут название папок? оО если про то что буквы некоторые большие то это ибо клава згорела и ишу через экранную, а она чет вчера глючила.
KOMATOZZ 21.12.2008, 11:15
у тебя файл хтпасс должен лежать в папке на котоую ты ставишь пароль, т.е. в твоем случае /www/FoRUm/paSS/.htpasswd
попробуй хтаксес тож туда закинуть
Омен 21.12.2008, 11:35
у тебя файл хтпасс должен лежать в папке на котоую ты ставишь пароль, т.е. в твоем случае /www/FoRUm/paSS/.htpasswd
попробуй хтаксес тож туда закинуть
не робит даже так, все там, при вводе правильного логина и пароля он не дает попасть в админку.
Омен 21.12.2008, 18:54
ну мне подскажут? :) плыз, оч надо :)
BlackHawk 21.12.2008, 19:05
чето я не могу разобраться с .htpasswd, точнее с пУтем К нему, пишу:потом ИДУ В АДмИнКУ Ввожу лоГИн И пАсс Из .htpasswd Жму оК А он не считывает пАсс =( подскажите может я че не правильно Делаю =(
отличный у тебя путь...Линукс у тебя стоит? нет? значит путь надо указывать полный. например C:/www/.htpasswd
слеш обязательно прямой

у тебя файл хтпасс должен лежать в папке на котоую ты ставишь пароль, т.е. в твоем случае /www/FoRUm/paSS/.htpasswd
попробуй хтаксес тож туда закинутьа вот здесь ты неправ. хтпассвд наоборот, чем дальше от веб-диры, тем лучше... это хтакцес должен лежать в той папке, которую запаролить надо
KOMATOZZ 21.12.2008, 19:06
отличный у тебя путь...Линукс у тебя стоит? нет? значит путь надо указывать полный. например C:/www/.htpasswd

причем тут линакс? чувак палюбас на локалке делает, либо вообще на удаленном....что за бред?
кстати да, попробуй проверить путь правильный или нет
KOMATOZZ 21.12.2008, 19:08
не робит даже так, все там, при вводе правильного логина и пароля он не дает попасть в админку.
пароль норм сгенерил?
поищи стандартные примеры в инете там есть сгенеренные пароли
BlackHawk 21.12.2008, 19:10
причем тут линакс? чувак палюбас на локалке делает, либо вообще на удаленном....что за бред?
кстати да, попробуй проверить путь правильный или нет
да знаю я :) я и говорю, что путь надо прописывать вместе с буквой диска
SoulRod 18.08.2009, 10:52
как написать RewriteRule для подпапки...
тоесть есть путь ..inf.php?open=folder/files
files в данном случае интерпритируется как сам файл с инфой..
folder это подпапка
сам скрипт заглядывает в папку texts и берет оттуда путь folder/files

нужно скрыть "inf.php?open=", некрасиво получается)..

писал для предыдущего скрипта, все норм работает.. но тот берет чисто из папки texts.
RewriteRule ^([a-z0-9]+) menu.php?open=$1вот для подпапки не пойму как.. кто знает подскажите

p.s. мозги кипят и что то упускаю наверно...
p.s.s. вообще такое можно сделать?
Druid_Nikola 19.08.2009, 10:16
как написать RewriteRule для подпапки...
тоесть есть путь ..inf.php?open=folder/files
files в данном случае интерпритируется как сам файл с инфой..
folder это подпапка
сам скрипт заглядывает в папку texts и берет оттуда путь folder/files

нужно скрыть "inf.php?open=", некрасиво получается)..

писал для предыдущего скрипта, все норм работает.. но тот берет чисто из папки texts.
RewriteRule ^([a-z0-9]+) menu.php?open=$1вот для подпапки не пойму как.. кто знает подскажите

p.s. мозги кипят и что то упускаю наверно...
p.s.s. вообще такое можно сделать?
Вариант решения:
.htaccess

RewriteEngine on
RewriteRule ^in/([^/\.]+)/([^/\.]+)/?$ /inf.php?dir=$1&file=$2 [L]
где
in/ - это строка в запросе по которой будем смотреть открывать файл или это обычный запрос
([^/\.]+)/([^/\.]+)/ - поддиректория + имя файла без расширения

inf.php (для примера)
<?php
if (isset($_GET["dir"]) && isset($_GET["file"])) {
$dir=$_GET["dir"];
$file=$_GET["file"];
if (!empty($dir) && !empty($file)){ include($dir."/".$file.".php");}
}
else die("404");
?>и, собственно, сам запрос
....