ilyuha.org: .htaccess как средство ограничения доступа @import "http://ilyuha.org/template/style.css"; @import "http://ilyuha.org/template/sh.css"; Блог Статьи Контакты О себе Статьи .htaccess как средство ограничения доступа Опубликовано 24.12.2007 // Тэги: apache, web // Комментарии: 0 Представьте себе ситуацию: на удаленном сервере хранится папка с файлами, которые должны быть доступны только вам и вашим знакомым. Задача не решается типичным образом, то есть установкой прав доступа. Возникнет вопрос: «Существуют ли варианты?» Да, конечно. Нельзя оставить без внимания возможности языка PHP с его механизмом авторизации. Говоря вкратце, этот механизм таков. При обращении к защищенной зоне браузер пользователя получает с сервера заголовок (header) WWW-AUTHENTICATE, после приема которого выдает окно для ввода логина и пароля. Две новые переменные, $PHP_AUTH_USER и $PHP_AUTH_PW соответственно, передаются обратно на сервер и проверяются на достоверность. В дальнейшем они могут быть задействованы и в других PHP-сценариях. Вообще, рассказ об авторизации посредством PHP заслуживает отдельной статьи, но сегодня на ней (PHP-авторизации) не будем останавливаться. К тому же, в запасе имеется неплохой вариант – использование штатных средств виртуального сервера Apache. Таким образом, назначив на определенную директорию пароль, вы обеспечите конфиденциальность информации: не зная «ключа», посторонние о ней ничего не узнают. Вместе с тем, эти данные будут доступны владельцу и по надобности некоторым другим пользователям – стоит лишь занести их в список приближенных и указать определенный пароль. Итак, начнем по порядку. Файл .htaccess Многим читателям, полагаю, уже известны некоторые свойства .htaccess. Это один из конфигурационных файлов Apache, т. н. файл управления доступом. Действия его директив распространяются на каталоги и подкаталоги, в которых он находится. По умолчанию именно такое имя, с точкой в начале, – .htaccess (определено директивой файла httpd.conf), но при желании администратор сервера может переназначить название на любое другое или вообще исключить файл из числа конфигурационных ( со значением none) либо ограничить действие отдельных директив. Мы рассматриваем вариант, когда .htaccess работает, или, правильней сказать, директивы .htaccess «в силе». В файл нужно внести несколько команд, которые в дальнейшем распознает и обработает Apache. AuthType Basic AuthName “Protected realm” AuthUserFile /home/localhost/.htpasswd AuthGroupFile /home/localhost/group Require valid-user Require group Group1 По-определенному настроенная, каждая директива требует пояснений: Basic – самый простой и распространенный тип аутентификации. Механизм ее работы во многом схож с упомянутым выше примером PHP-авторизации, а именно: при попытке доступа к защищенной директории на сервере браузер получает заголовок 401 authentication required, после чего появляется окно ввода комбинации login/password. Введенные данные отсылаются на сервер, где Apache сверяет, достоверные они или нет. Если да, то пользователь получает доступ к защищенной зоне плюс специальное имя-переменную в распоряжение – область действия. В противном случае доступ к защищенной области, разумеется, не откроется Имя защищенной зоны () – оно отображается в заголовке окна для ввода логина/пароля. Заголовку желательно давать английское наименование, поскольку русское, из-за проблем с кодировками в браузерах, не всегда отображается корректно Директива указывает на полный (абсолютный) путь к файлу паролей относительно корня сервера. Именно сервера, а не сайта. Неправильно прописывать путь расположения файла относительно каталогов /htdocs, /www. Замечу, в этом частая ошибка многих новичков. Как же выяснить правильный путь для директивы? Вот вам верный и простой способ. Создайте в текстовом редакторе PHP-файл с запросом “” (ковычки убираются) и запустите его на хосте. Браузер отобразит таблицу с различными переменными и их значениями. В столбце Variable найдите строку DOCUMENT_ROOT или _SERVER[“DOCUMENT_ROOT”]. Напротив, во втором столбце, будет указан полный путь от сервера к домашней директории. – по надобности. Когда доступом к приватной зоне обладает большое количество посетителей, удобно распределить их по группам, например: пользователи, модераторы и т. д. Структура файла групп должна быть такой: Group1: user1 user2 user3 Group2: user1 user2 user3 GroupN здесь – название группы, а userN – имя посетителя Команда Require определяет тех пользователей (или ту группу), которым (которой) предоставляется вход в защищенную зону. Опцией valid-user разрешается доступ всем, кто в списке auth-файла. Если вы хотите организовать доступ к ресурсу лишь нескольким лицам из списка, укажите Require user test1 test2, …, где test1, test2 и т. д. – имена разрешенных пользователей. Предоставление доступа группам – соответственно: Require Group1 (Group1 – группа). После того как .htaccess создан, поместите его в ту директорию, которую вы планируете защитить от посторонних. Возможно, подобный файл уже существует, тогда просто допишите Auth-директивы в содержание .htaccess. Составление аутентификационного файла Разумеется, имена пользователей и их пароли должны храниться в скрытом от посторонних глаз файле. Путь к нему указывает директива . Распознав знакомую команду, Apache ищет аутентификационный файл (здесь и далее – .htpasswd, хотя могут быть какие угодно варианты) именно там, где вы указали. А располагать «ключи» лучше всего в директории, расположенной ниже уровня сайта. Так безопаснее. Размещая .htpasswd выше корня сайта, примите меры предосторожности: в каталог, где будет находиться файл с паролями, добавьте .htaccess такого содержания: deny from all Командой deny from all запрещается доступ к файлу .htpasswd каталога, а тэги <> и определяют область действия директивы. Подробнее о Deny|Allow вы прочитаете ниже, а сейчас мы обратимся к главному – файлу паролей. Он должен иметь следующую структуру: user:password … user:password Создается файл аналогичной структуры в любом текстовом редакторе. Как уже было сказано, имя и расширение могут быть любыми, однако .htpasswd все же предпочтительнее. Дело в том, что главный конфиг Apache (httpd.conf) уже по умолчанию защищает файлы, названные по маске ^\.ht, от просмотра, поскольку считает их служебными. А дополнительная защита, конечно, не помешает. Кстати, согласитесь: хранить на чужом сервере пароли «в оригинале» несколько нерационально. Весьма желательно зашифровать их, например, в MD5. Уж если злоумышленник и узнает пароль в MD5-хэше1, ему придется потратить порядочно времени на расшифровку – зависит от длины, сложности исходного пароля, а также от мощности оборудования взломщика. Поэтому предлагаю вам создать именно зашифрованный аутентификационный файл. В этом направлении окажет помощь утилита Htpasswd, которую нетрудно отыскать в составе комплекса «Денвер». 1 2 Поиск " /> Облако тэгов apache, blog, blogosphere, chmod, cms, css, denwer, flickr, ftp, hosting, htaccess, html, it, javascript, journalism, mail, photoshop, phpmyadmin, rss, site, soft, sql, ssh, textpattern, trackback, ubuntu, web, wiki, windows, wysiwyg Рекомендую: www.alistapart.com www.designformasters.info www.habrahabr.ru www.smashingmagazine.com www.veerle.duoh.com Блог Статьи Обратная связь RSS 2007 - 2008, Ilyuha.org = 4 limit 1] [SQL (0,016198): select * from txp_txp_section as txp_section where name = 'articles' limit 1] [SQL (0,016539): select *, unix_timestamp(Posted) as uPosted from txp_textpattern as textpattern where ID=16 and Status = 4] [статья 16] [SQL (0,016217): select ID, Title, url_title, unix_timestamp(Posted) as uposted from txp_textpattern where Posted > '2007-12-24 21:56:10' and Section = 'articles' and Status=4 and Posted < now() order by Posted asc limit 1] [SQL (0,024103): select ID, Title, url_title, unix_timestamp(Posted) as uposted from txp_textpattern where Posted < '2007-12-24 21:56:10' and Section = 'articles' and Status=4 and Posted < now() order by Posted desc limit 1] [SQL (0,016564): select host from txp_txp_log as txp_log where ip='82.146.44.70' limit 1] [SQL (0,004950): insert into txp_txp_log set `time`=now(),page='/htaccess-kak-sredstvo-ogranicheniya-dostupa',ip='82.146.44.70',host='onsp.net',refer='',status='200',method='GET'] [SQL (0,011848): select user_html from txp_txp_page as txp_page where name='default'] [Страница: default] [SQL (0,011076): select Form from txp_txp_form as txp_form where name='head'] [Форма: head] [SQL (0,006367): select Form from txp_txp_form as txp_form where name='nav'] [Форма: nav] [SQL (0,028926): select name, title from txp_txp_section as txp_section where name in ('Blog','Articles','Contact','About') order by field(name, 'Blog','Articles','Contact','About')] [SQL (0,011150): select Form from txp_txp_form as txp_form where name='content'] [Форма: content] [: true] [: false] [: false] [: false] [: false] [: false] [: true] [SQL (0,045528): select *, unix_timestamp(Posted) as uPosted from txp_textpattern as textpattern where ID = 16 and Status = 4 limit 1] [статья 16] [SQL (0,016866): select Form from txp_txp_form as txp_form where name='full_article'] [Форма: full_article] [SQL (0,001893): select Form from txp_txp_form as txp_form where name='article_heading'] [Форма: article_heading] [SQL (0,005337): select Keywords from txp_textpattern as textpattern where ID='16' AND Keywords ''] [SQL (0,003876): select Form from txp_txp_form as txp_form where name='comments_display'] [Форма: comments_display] [: false] [: false] [SQL (0,022988): select *, unix_timestamp(posted) as time from txp_txp_discuss as txp_discuss where parentid=16 and visible=1 order by posted ASC] [: false] [: false] [SQL (0,013987): select Form from txp_txp_form as txp_form where name='sidebar'] [Форма: sidebar] [SQL (0,003311): select name from txp_txp_section as txp_section where searchable != '1'] [SQL (0,002613): select Keywords from txp_textpattern as textpattern where Keywords ''and Section != ''and Section != 'contact' and Section != 'tag' and Section != 'search' and Status >= '4' and Posted < now()] [SQL (0,008421): select Form from txp_txp_form as txp_form where name='top'] [Форма: top] [SQL (0,025378): select *, unix_timestamp(date) as uDate from txp_txp_link as txp_link where 1 order by linksort asc ] [SQL (0,012242): select Form from txp_txp_form as txp_form where name='plainlinks'] [Форма: plainlinks] [Форма: plainlinks] [Форма: plainlinks] [Форма: plainlinks] [Форма: plainlinks] [SQL (0,009833): select Form from txp_txp_form as txp_form where name='footer'] [Форма: footer] [ ~~~ secondpass ~~~ ] --> kiev apartments service wow - snr roulements summer