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

Владимир | | htaccess, Web разработка, Безопасность.

Логотип для 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мастера. Читать всем!

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

    • Да. Кроме того, индексироваться не будут все вложенные папки.

      • Саня

        поправка индексироваться не будут все вложенные папки если в них отсутствует .htaccess (даже пустой) если присутствует действие корневого .htaccess отменяет

        • Правильно, иначе нет смысла. Если htaccess во вложенной папке не может отменить правила htaccess в родительской, то и смысла в нём нет.

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

    • Да. Кроме того, индексироваться не будут все вложенные папки.

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

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

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

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

  • dark_angel

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

  • dark_angel

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

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

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

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

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

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

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

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

    • Как вариант, можно положить в папку index.html с каким-нибудь произвольным текстом, вроде «Доступ запрещен».

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

    • Как вариант, можно положить в папку index.html с каким-нибудь произвольным текстом, вроде «Доступ запрещен».

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

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

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

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

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

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

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

    • Посмотреть его нельзя (если, конечно, у вас нет FTP доступа). Но получить файлы, которые в ней находятся — можно. Т.е. если в корне сайта лежат myfile.html и index.html, то запрос
      http://mysite.domen/
      вернет вам содержимое index.html, но на запрос
      http://mysite.domen/myfile.html
      вы получите myfile.html.

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

    • Посмотреть его нельзя (если, конечно, у вас нет FTP доступа). Но получить файлы, которые в ней находятся — можно. Т.е. если в корне сайта лежат myfile.html и index.html, то запрос
      http://mysite.domen/
      вернет вам содержимое index.html, но на запрос
      http://mysite.domen/myfile.html
      вы получите myfile.html.

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

    • Все супер хитрые способы в документации к апачу 🙂

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

    • Все супер хитрые способы в документации к апачу 🙂

  • qq

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

  • qq

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

  • qq

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

  • qq

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

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

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

  • qq

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

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

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

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

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

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

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

  • qq

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

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

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

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

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

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

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

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

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

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

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

  • Alex

    Отличная статья. Спасибо.

  • Alex

    Отличная статья. Спасибо.

  • Александр

    Было бы интересно еще узнать в данной статье как запретить запуска скриптов в папке, т.е. вида
    php_flag engine off
    их через include вполне можно будет использовать,но и скрипты запускаться не будут )

    • Я не совсем понял, зачем использовать include?

      php_flag engine off
      можно записать в .htaccess

      Еще можно использовать и такой вариант
      RemoveType application/x-httpd-php .php

  • Peto

    добрый день.есть папка images,там лежать картинки но вот эту папку взломали, хочу знать как запретить показ всех этих файлов , которые находятся в папке images. но при этом есть картинки , например лого сайта, который должен показаться в сайте , но например mysite/images/logo.img не должен работать.

    • Разбейте файлы на 2 папки. К одной из них запретите доступ.

      • KoLkA DeMeNtIeV

        Как запретить доступ только для одной папки?

  • Gmobix

    Спасибо

  • James

    Еще вопрос из той же оперы — есть сайт, в корне лежит файлы index.php и допустим main.php. Вопрос — как запретить доступ к main.php и к любым другим файлам через http://site.ru/main.php

    Спасибо

    • Если я правильно понимаю, вы не хотите чтобы к файлу обращались напрямую, а все запросы шли через index.php?

      Чтобы не зависеть от htaccess и настроек сервера можно сделать так.

      В index.php объявляете какую-нибудь константу.
      define('HELL0','Hello, world!');

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

      if (!defined('HELL0')) exit('Please, don't access this script directly');

  • ага я всегда делаю) в каждую папку сую файл index.html  
    с текстом «просмотр содержимого этой страницы запрещён» 🙂

  • Elena

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

    • Самый простой вариант — установить ftp сервер.

      • Elena

        Нет, закачка д.б. по ftp, а скачка с http

        • Существует довольно много файловых браузеров, которые вы можете установить на своем хостинге — выбирайте

  • Megamasyanya

    Спасибо большое и за статью, и за вопросы и ответы. Мне помогло.

  • Возможно, вопрос глупый, но как закрыть доступ в одному файлу, находящемуся не в корневой директории.

    Я пробовал создать в этой папке файл .htaccess и писать в нем

    deny from all

    но это не помогло. Я не могу понять, что я не так сделал?

    • Попробуйте так
      <Files local.xml>
      Order allow,deny
      Deny from all
      </Files>

  • Дмитрий Кароль

    Спасибо все теперь отлично работает)