Только для читателей Lifeexample возможно открыть интернет-магазин на Moguta.CMS со скидкой в 15%

<<< MVC — фундамент интернет магазина || Модули интернет магазина >>>

htaccess запретить доступ

11.02.2012
htaccess запретить доступ

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

Первой причиной такого желания может стать наличие админской части сайта и необходимость скрыть ее от чужих глаз и рук. Вторым поводом к запрету доступа может являться процесс внедрения изменений на вашем сайте с необходимостью перенаправления пользователей на временную страницу информации.

В этой статье я покажу как можно:

  • С помощью .htpasswd и .htaccess запретить доступ к папке сайта.
  • Закрыть доступ к сайту для всех, кроме одного IP адреса.
  • С помощью .htaccess и .htpasswd настроить политику прав пользователей.
  • Создать .htpasswd файл паролей, и где его лучше расположить.

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

Как с помощью .htpasswd и .htaccess запретить доступ к папке сайта.

Если ты читатель не знаешь, что это за файлы поясню:

.htaccess — файл дополнительной конфигурации веб-сервера.

.htpasswd — файл содержащий пары логин и пароль в MD5 хеше, используемый в механизме базовой аутентификации.

С помощью этих двух файлов можно запросто сделать так чтобы при попытке открыть сайт пользователям предлагалось ввести логин и пароль.

htaccess-htpasswd запретить доступ

Только после того как пользователь правильно введет пару логин и пароль, соответствующую занесенной в файл .htpasswd, он будет допущен к просмотру скрытой области сайта.

Для того чтобы это осуществить достаточно создать файл .htaccess и поместить его в ту папку сайта к которой вы хотите запретить доступ.

1. Добавьте в созданный файл следующее содержание:

1
2
3
4
AuthType Basic
AuthName "Please input login and password!"
AuthUserFile  /usr/host/mysite/.htpasswd
require valid-user
  • AuthType — может иметь значение Basic или Digest, в нашем случае нам подойдет Basic.
  • AuthName — текст выводимый вместе с формой авторизации.
  • AuthUserFile — путь к файлу с паролями (.htpasswd).
  • AuthGroupFile — путь к файлу групп, если он существует.
  • Require — определяет параметры аутентификации. (User,Group,Valid-user) Valid-user – все прошедшие проверку. User – пользователи имеющие права доступа. Group – группы пользователей имеющие права доступа.

2. Теперь создайте файл .htpasswd и в него поместите следующую строку:

1
admin:$apr1$ejtOHg/4$cMColJLMZ39weAalo3V8k0

Строка эта содержит пару логин и пароль где:

1
2
Логин: admin
Пароль: 1

Чтобы генерировать любые пароли для файла .htpasswd можно воспользоваться утилитой для генерации паролей htpasswd.exe

Скачать утилиту для генерации паролей htpasswd.exe ( Скачали: 2502 чел. ) 

Пользоваться утилитой для генерации паролей очень легко, нужно создать файл .htpasswd и в программе выбрать его с помощью кнопки «Old file«. Далее все интуитивно понятно, вводим новых пользователей и пароли к ним, затем жмем на «Update«. Кстати данная утилита генерации паролей для htpasswd, может не только создавать новые, но и редактировать старые пароли. Что очень удобно, в случае если вы забыли старый пароль. Еще стоит сказать что эта утилита является стандартной и поставляется вместе с сервером Apache.

На многих сайта и блогах, рассказывается, как пользоваться ей с помощью CMD, но нигде не встречал о том, как создавать пароли с ее графическим интерфейсом, а это может быть очень удобным для начинающих вебмастеров.

Утилита для генерации паролей htpasswd.exe

Теперь важный для новичков момент! Напротив директивы AuthUserFile в .htaccess должен быть прописан абсолютный путь до файла с паролями. Узнать путь можно многими способами, но самый легкий и точный, на мой взгляд, это выполнить в index.php строку кода:

1
echo $_SERVER['DOCUMENT_ROOT'];

Выполнение этой строчки кода приведет к выводу на страницу абсолютного путь до корня сайта, который нам и нужен.

Внимание важное замечание! Очень полезным будет расположить файл с паролями вне папки с содержимым сайта. Это позволит защитить его от злоумышленников.

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

1
2
3
<Files .htpasswd>
   deny from all
</Files>

Настало время проверить работоспособность базовой авторизации. Откроем сайт через любой браузер.

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

Запретим доступ к одному файлу

Кроме запрета на директорию можно установить ограничение доступа к конкретному файлу, для этого нужно обрамить запись из .htaccess в тег <Files>

1
2
3
4
5
6
<Files "passwd.txt">
AuthType Basic
AuthName "Please input login and password!"
AuthUserFile  /usr/host/mysite/.htpasswd
require valid-user
</Files>

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

Как с помощью .htaccess и .htpasswd настроить политику прав пользователей

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

Допустим, у нас есть сайт http://lifeexample.ru и три директории отличающиеся степенью секретности.

  1. http://lifeexample.ru/index.php — доступ имеют все пользователи из файла .htpasswd .
  2. http://lifeexample.ru/admin/ — доступ имеют админы и cуперпользователи.
  3. http://lifeexample.ru/admin/root/ — доступ имеют только cуперпользователи.

Чтобы реализовать разграничение пользователей, нужно объединить их в группы. Для этого в системе базовой аутентификации предусмотрен механизм работы с группами пользователей.

Создадим файл .htgroup, в него запишем группы и их пользователей в таком виде:

1
2
3
Users: user user2 user3
Admins: admin admin2 admin3 user3
Root: root root2 root3

Замечу, что пользователь с логином user3 состоит сразу в двух группах, и это значит, что он имеет доступ с админской части сайта. Сразу подправим файл .htpasswd и с помощью скачанной ранее программки для генерации паролей, занесем него всех пользователей из созданных групп.

Теперь в настройках .htaccess заменим строку:

1
require valid-user

на следующую:

1
require group Users Admins Roots

И расположим файл в главной директории сайта. Проверяем… И видим что ничего не работает. Это вполне объяснимо ведь мы не указали путь до файла с группами. Перед require добавим AuthGroupFile указав в ней путь:

1
AuthGroupFile /usr/host/mysite/.htgroup

Теперь можно радоваться, все заработало.

Т.к. файл .htaccess располагается в главной директории, вышеперечисленными действиями мы отрываем доступ к http://lifeexample.ru/index.php для всех имеющихся пользователей.

Следующей задачей будет отсеять обычных пользователей и оставить доступ только группам Admins и Roots к части http://lifeexample.ru/admin/. Сделать это проще чем кажется, нужно только скопировать .htaccess из главной директории, в папку “/admin” и подправить список допустимых групп, удалив из него группу Users.

Аналогичную операцию проделаем для папки “/admin/root” предназначенной только суперпользователям. Скопируем файл настроек и оставим там только группу Roots.

Еще один важный момент, если в .htaccess до всех этих операций содержались другие настройки, то при копировании этого файла в папки сайта, можно оставить только строки отвечающие за права доступа.

Страница заглушка

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

Страница заглушка

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

1
2
3
4
5
<ifModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REMOTE_ADDR} !=127.0.0.1
RewriteRule ^.* zaglushka.php [L]
</ifModule>

Добавив эти строки и, заменив “127.0.0.1” на свой реальный IP адрес, только мы будем иметь доступ к содержимому сайта, а все остальные IP адреса, будут перенаправляться на страницу zaglushka.php. Кстати ее нужно будет создать и поместить в корневую директорию.

Может случиться так что модуль перенаправления mod_rewrite.c будет отключен хостером. Тогда с эту задачу можно будет решить с помощью php:

1
2
3
4
5
6
7
8
9
10
11
12
$SecretKey = '123456789';
$AdminCookie = 'Вход выполнен';
if ($_COOKIE['AdminCookie'] != $AdminCookie && $_SERVER['QUERY_STRING'] != $SecretKey) {
    require_once 'zaglushka.html';
    exit;
} else {
    setcookie('AdminCookie', $AdminCookie, time()+3600*24*365, '/');
    if ($_SERVER['QUERY_STRING'] == $SecretKey) {
        header('Location: /');
        exit;
    }
}

Для того чтобы получить доступ к сайту нужно ввести http://имя сайта/?123456789, если код не будет веден, пользователю будет выдана страница заглушка.

Конечно, можно обойтись и более коротким куском кода:

1
2
3
if($_SERVER['REMOTE_ADDR'] != "мой.ip.адр.ес"){
header('Location: /zaglushka.html');
}

Но первый вариант решения мне кажется, наиболее элегантным, поскольку с одного IP может входить сразу несколько пользователей, и один из них не должен иметь доступ к сайту. Для этого в первом способе используется секретный ключ.

С помощью данного скрипта можно реализовать хорошую систему аутентификации сайта с запретом доступа отдельных пользователей.

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

Аналогичный механизм с использованием cookes и секретного ключа можно выполнить с помощью .htaccess:

1
2
3
4
5
6
RewriteCond %{HTTP_COOKIE} !hash276819937ee81772017638837ab49992heef78=true [NC]
RewriteCond %{QUERY_STRING} (123456789)
RewriteRule .+ setcookie.php?%1 [L]
RewriteCond %{HTTP_COOKIE} !hash276819937ee81772017638837ab49992heef78=true [NC]
RewriteRule .+ index.html [L]
RewriteRule .+ index.php

Закрыть сайт для всех ip адресов

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

1
2
3
order deny,allow
deny from all
allow from 127.0.0.1 #[СВОЙ IP]

127.0.0.1 – заменить на свой.

Закрыть сайт для списка ip адресов

1
2
3
4
Order deny,allow
Deny from all
Allow from 127.0.0.1 #[ запрет для одного IP]
Allow from 127.0     #[ запрет со всех серверов, начинающихся на эти числа]

В этой статье мы рассмотрели тему: “Как с помощью htaccess запретить доступ к части сайта”, статья получилась объемная и хотелось бы подвести итоги. И так самое главное было понять, как работает механизм базовой аутентификации, и зачем он вобще нужен. Напомню, что данную аутентификацию лучше не использовать там где нужно реально защитить важную информацию. Если ты уважаемый читатель еще не разобрался с тем как настраивать файлы паролей и групп, предлагаю тебе скачать их в готовом виде:

Скачать все файлы в одном архиве ( Скачали: 2502 чел. ) 

Чтобы не пропустить публикацию следующей статьи подписывайтесь на рассылку по E-mail или RSS ленту блога.

Нравится

Комментарии

  • Ильяс

    А возможно ли с помощью htaccess сделать доступ к одному сайту только с другого?

    • Я думаю можно. наверное надо копать в сторону RewriteCond %{HTTP_REFERER}.

  • андрей

    я все сделал как сказано, но все равно не работает(((

  • petrycho

    А как поставить заглушку для определенного списка ip адрессов?

  • cyberKatze

    есть ли возможность запрета доступа к какой либо папке по времени?

    если например надо генерировать пользователей которым будет разрешен доступ только с 8:00 до 16:00

    ??

    • Не уверен что можно это сделать с помощью .htaccess, но на сервером языке вполне реально такое реализовать.

  • petr

    Mark не посоветуете как решить мою задачу, поставить заглушку для конкретных айпи адрессов? Очень нужно, спасибо за ранее.

    • Как вариант:

      1
      2
      3
      4
      5
      $ip = "192.168.0.2";
      $ipBan = array("192.168.0.1", "192.168.0.2", "192.168.0.3", "192.168.0.4");
      if (in_array($ip, $ipBan)) {
          echo "Выводим заглушку для".$ip;
      }
  • petr

    Прописал этот код в .htaccess в echo вставив путь к заглушке но ничего не работает. Кроме этого больше ничего не нужно писать? Вот так выглядит мой код:

    1
    2
    3
    4
    5
    6
    7
    <?php
    $ip = "109.124.204.193";
    $ipBan = array("109.124.204.193", "46.21.144.51");
    if (in_array($ip, $ipBan)) {
         echo "zaglushka.html".$ip;
    }
    ?>

    И ещё такой вопрос, при таком варианте:

    1
    2
    3
    4
    Order Allow,Deny
    Allow from All
    Deny from 109.124.204.193
    ErrorDocument 403 "Сайт временно не работает"

    Как сделать так, чтобы отображались русские буквы, и можно ли вместо надписи как-то перенаправить нежелательных гостей на страницу заглушки?

    • По первому вопросу, не нужно делать вывод, нужно на этом месте подключить файл;
      Например так:
      include(‘zaglushka.html’);

      По второму вопросу, я думаю русский лучше текст поместить в html страницу, и показывать ее:
      ErrorDocument 403 http://ваш сайт/403.html

    • Игорь

      Этот код надо писать не в .htaccess — а в некоторый php файл

  • petr

    При таком варианте почемуто страничку с заглушкой не выдает.

    1
    2
    3
    4
    Order Allow,Deny
    Allow from All
    Deny from 109.124.204.193
    ErrorDocument 403 http://www.site.ru/403.html

    Пишет следующее:

    Found
    the document has moved here
    ___________________________
    Apache/2 server at site.ru Port 80

    при переходе на ссылку here ничего не грузит

    • А вы файл создали 403.html в корне сайта?

  • petr

    я понял, страница не грузится потому как доступ к сайту запрещен, и эта страница входит в число запрещенных страниц. Вставил левый сайт, и все грузится… Отсюда вопрос, как исключить страницу заглушки от запрета? Вы не знаете как это можно реализовать?

  • Попробуйте так:

    1
    2
    3
    <Files 403.html>
       deny from all
    </Files>
  • Богдан

    Дякую за гарну статтю!

  • T.M.

    будет здорово, если сможете мне ответить
    при помощи htaccess мы можем задать пользователю группу
    а можно ли сделать так, чтобы для определенной группы скрывался определенный div?
    может как-то через js?

  • Сергей

    Запрет для одного адреса где прописывать? В каком месте файла подскажите

  • Гена

    Поскажите, как в .htaccess, запретить индексировать картинки залитые не на сайт, а на стороние фотохостинги?

  • Иван

    Здравствуйте! Подскажите, пожалуйста! Пользуюсь wordpress хочу сделать что бы не было прямого доступа как показано на скриншоте ссылка, IP меняется, если поставить запрет на все папки, то не отображаются картинки и загруженные файлы на сайте, потому что все грузит в одну папку…
    Кто подскажет как быть? Не как не подберу как закрыть прямой доступ к попке /file, но с возможностью скачивать по защищенным ссылкам и отображения на сайте…

  • Алексей

    Добрый день! после установки доступа по логину и паролю данным методом сервер выдает ошибку:
    Server error!
    The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there was an error in a CGI script.
    If you think this is a server error, please contact the webmaster.
    Error 500

    • NicromanseR

      Сохраните .htpasswd и .htaccess в (UTF8 без BOM)

  • legos

    Добрый день!
    А как можно сделать в htaccess аутентификацию для определенного списка айпи адресов

  • Valera

    Отличная статья, поставил еще одно заграждение для доступа в админку, вроде отрабатывает! Спасибо

  • Оставить комментарий

    Подписаться на комментарии к этой статье по RSS

    Размещение статей и контекстных ссылок
    Яндекс.Метрика