Как запретить просмотр содержимого папки на сервере

7 августа, 2008

Логотип для htaccess

Веб сервер Apache имеет несколько директив (находятся в файле httpd.conf), которые определяют, что будет показано, когда посетитель заходит в какую-то папку.

Прежде всего, это
DirectoryIndex

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

DirectoryIndex index.php index.html index.htm

Приоритет имеет тот файл, который идет первым в списке. Т.е. если папка содержит index.php и index.html, то посетителю будет отправлен index.php.

Теперь небольшой пример. Допустим, сайт имеет такую структуру.

/
index.html
page1.html
page2.html
css/
    styles.css

По адресу http://sitename/ вы увидите страницу index.html.
Но если зайти в папку css (http://sitename/css), то картинка будет примерно такая

Список файлов на сервере

Список файлов на сервере

Т.е. сервер покажет вам список файлов в этой папке. Не думаю, что кому-то понравится такое поведение сервера.

Исправить ситуацию можно с помощью директивы:

Options -Indexes

Примечание: символ «-» перед словом Indexes означает, что индексирование содержимого папок запрещено.

Теперь если вы попытаетесь зайти в папку css, то увидите сообщение:

Forbidden
You don't have permission to access /css/ on this server. (у вас нет прав для доступа к /css/ на этом сервере).

При этом доступ к файлу styles.css (http://sitename/css/styles.css) сохраняется.

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

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

Правда, этот метод может не работать. Дело в том, что обработка файлов .htaccess может быть запрещена директивой AllowOverride none (в файле httpd.conf).

В этом случае вам нужен либо доступ к httpd.conf, либо придется в каждой папке размещать файлы index.html с каким-нибудь текстом (что-то вроде Access forbidden). Кстати, разработчики фреймворка CodeIgniter именно так и поступают (в каждой вложенной в system папке находится index.html).

Примечание. Для того чтобы вступили в силу изменения в httpd.conf нужно перезапустить сервер. Изменения в .htaccess начнут работать сразу после сохранения файла.

Спонсор статьи:
Записки webмастера. Читать всем!

Понравилась статья? Подписывайтесь на продолжение rss link !

Или на мой твиттер twitter link

]]>

Добавьте эту страницу в google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru

]]>

Опубликовано в Web разработка, htaccess, Безопасность Комментарии (23) »

]]>

Комментарии (23)

Вы можете отслеживать обсуждение записи с помощью RSS 2.0 rss link

Вы также можете оставить комментарий, или трекбек с Вашего сайта.

]]>
  1. Директиву Options -Indexes нужно писать в корневом .htaccess? Это будет означать, что запрещено индексировать корневую папку?

  2. Так, а индексирование документов (гуглом, яндексом и пр.) при этом будет продолжаться?

    • Конечно будет.
      Запрещается индексирование файлов движка сайта, а не его страниц. Т.е. web сервер просто не будет возвращать список файлов в конкретной папке. Сами файлы будут доступны и любой поисковый робот их легко найдет, т.к. он использует ссылки на страницах.
      Если нужно дать указания роботу – используйте robots.txt

  3. dark_angel

    берется софтина для скачивания всего сайта типа телепорта и вся эта защита отправляется лесом, все ваши "forbidden" страницы на жестком диске злоумышленника…

  4. Те страницы, куда ссылок нет, не окажутся.

  5. Те страницы, куда ссылок нет, — не окажутся.

  6. dark_angel, m4rr прав.
    Программы вроде телепорта находят только те страницы, на которые есть ссылки. И локальная версия сайта, которую они создают, в большинстве случаев вообще не соответствует структуре сайта на сервере.
    Например, эта страница называется kak-zapretit-prosmotr-soderzhimogo-papki-na-servere.html
    Если вы скачаете этот блог телепортом, то на вашем винчестере будет файл с таким названием. Но на сервере такого файла нет.
    Страница создается скриптом index.php (он подключает другие скрипты), а название страницы рассматривается просто как параметр.
    Используя его движок блога получает нужную информацию из базы данных.

  7. Кстати, как насчёт того, что данная директива может не работать на некоторых версиях Apache даже при разрешении использования .htaccess

  8. Доброе время суток!
    У меня вскрыли сайт. На сайте есть папка, доступ к которой надо закрыть. .Htaccess не работает.
    Вскрыли сайт таким образом – зашли в эту папку (к которой доступ закрыть надо), удалили один из файлов, и заменили его на файл с другим именем, в котором был вирус. По вашему совету, я разместил в этой папке index.html с переадресацией на главную страницу. Сможет ли хакер влезть еще раз в эту папку? Сайт ломают уже второй раз!

    • Приветствую!
      Зайти в папку на сервере просто так нельзя, независимо от того есть index.html или нет (этот файл к защите в общем-то отношения не имеет, он просто будет отображаться вместо списка файлов в папке). Для входа на сервер нужен либо FTP доступ, либо нужно найти дыру в скрипте, который может сохранять файлы на сервере.
      Например, если у вас есть скрипт, который используется для загрузок картинок на сервер и в нём не проверяется тип файла, то кто угодно сможет отправить вам в папку с картинками свой скрипт с вирусом.

      Поэтому вам сейчас нужно определить как именно взломали ваш сайт и закрыть дыру. К сожалению, простого способа это выяснить не существует. Я бы сразу сменил пароль на FTP и начал проверять скрипты. Если вы используете какой-то движок, то желательно его обновить и поискать в интернете сообщения о его уязвимостях.

  9. А вот вопрос "на встречу": как просмотреть содержимое папки, если в ней есть index.html?

  10. ну, это понятно. я думал, может есть какой-то хитрый способ известный спецам:)

  11. qq

    У меня в чём-то похожая проблема. Не знаю, с чего начать копать.
    Папка mydomain/docs – это DocumentRoot. В ней лежит index.php.
    В mydomain/php лежат файлы, которые можно включать в скрипты
    при помощи include('myclass.php').
    Надо сделать так, чтобы подключить файл позволялось,
    а считать его содержимое не позволялось бы:
    //file: index.php

  12. qq

    $c = file_get_contents('../php/myclass.php');
    echo $c;

  13. Вынесите файлы за пределы DocumentRoot, например, на уровень выше. И подключайте так:
    include('../myclass.php')

  14. qq

    эти файлы уже находятся за пределами DocumentRoot.
    Смысл в том, чтобы защитить эти файлы от глюканувшего
    (или хакнутого) скрипта, выполняемого в DocumentRoot.
    Может, надо чего-то прописать в php.ini?
    Настройки какие-то для защищённого режима, права доступа…
    Т.е. надо, чтобы, скрипты не имели доступа к файлам
    за пределами DocumentRoot, но могли инклюдить те из них, что
    в path_include.

    • защитить эти файлы от глюканувшего(или хакнутого) скрипта

      Закрыть доступ к файлам для скрипта можно изменением прав доступа. Причем закрыть для отдельного скрипта не получится. Скрипты выполняются интерпритатором PHP, который в свою очередь запущен апачем. Т.к. права доступа выставляются для пользователей, то вам нужно посмотреть от имени какого пользователя запускается apache и выставить соответствующие права для файла.

      Если речь идет о shared хостинге, то apache работает от имени какого-то администратора. Вы можете с помощью FTP клиента изменить права на доступ к файлу, оставить доступ только для себя (например, так chmod 600). После этого у скриптов доступа к файлу не будет.

      chmod 666 предоставит доступ на чтение и запись всем.

      chmod 644 – доступ на запись только для себя, на чтение – остальным.

      В общем, если у вас есть скрипт, которому для работы нужны данные подключения к БД. И кто-то его хакнет, то этот кто-то получит ваш пароль к базе.

  15. Доброго времени суток!
    У меня вопрос по теме поста. Допустим, у меня на сайте есть много директорий с разными названиями, но в каждой из них лежат два файла с именами xxx.html и yyy.html
    Мне нужно запретить доступ к xxx.html, но при этом вместо ошибки 403 делать редирект на yyy.html
    Как решить первую чать задачи (запретить доступ), я знаю. Помогите пожалуйста с организацией редиректа.

  16. Попробуйте так
    redirect 301 /xxx.html /yyy.html
    Возможно нужно будет убрать правила, которые запрещают доступ к файлу xxx.html

]]>

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

* - обязательные для заполнения поля

]]>