запретить прямой доступ к папке и файлу с помощью htaccess

134

Вот сценарий:

  • В index.phpкорневой папке есть файл
  • включены некоторые файлы, index.phpкоторые находятся в includesпапке.
  • Еще 1 файл ( submit.php) находится в корневой папке для действия отправки формы.

Я хочу ограничить прямой доступ пользователей к файлам в includesпапке с помощью htaccess. также для submit.php. Но include будет работать для index.phpфайла. Мол, если пользователь вводит www.domain.com/includes/somepage.php, он его ограничит (может быть перенаправлен на страницу с ошибкой).

Imrul.H
источник

Ответы:

266

Я бы просто переместил includesпапку из веб-корня, но если вы хотите заблокировать прямой доступ ко всей includesпапке, вы можете поместить .htaccessв эту папку файл, содержащий только:

deny from all

Таким образом, вы не сможете открыть какие-либо файлы из этой папки, но вы можете без проблем включить их в php.

Йерун
источник
7
Сможет ли другой файл сделать запрос ajax к файлу, находящемуся в этой папке?
Чайтанья Чандуркар
16
@ChaitanyaChandurkar Нет, ajax-запрос - это обычный http-запрос, поэтому он будет отклонен.
jeroen 02
Sr b / c I новое веб-программирование. Как добавить исключение для доступа к моему файлу index.php?
PhatHV
Я использовал запретить всем, и он ограничивал каждый URL .. даже не показывал страницу входа .. :(
Аамир
@Aamir Это верно, URL-адреса в этой папке не будут доступны, но вы можете без проблем включить их в другие файлы.
Йерун
56

Это чистое mod_rewriteрешение:

RewriteRule ^(includes/|submit\.php) - [F,L,NC]

Это покажет запрещенную ошибку для использования, если URI содержит либо /includes/или/submit.php

анубхава
источник
3
Хорошая работа над файлом отправки
CTS_AE
29

Можно использовать директиву Files и запретить доступ ко всем файлам, а затем использовать ее снова, чтобы установить файлы, которые доступны:

<Files ~ "^.*">
  Deny from all
</Files>

<Files ~ "^index\.php|css|js|.*\.png|.*\.jpg|.*\.gif">
  Allow from all
</Files>
luke1985
источник
7
Я не уверен в том, кто разместил вопрос, решена ли его проблема или нет, но в этом прелесть ТАК, что множественный ответ может помочь многим участникам. Этот последний ответ решил мою проблему. Я хочу, чтобы сайты получали файл css, но не имели доступа к шрифтам ttf или otf, и бум! решена.
Moxet Khan
после этого я не могу получить доступ к файлам в подпапках
Gintare Statkute
14

1 лайнер на основе mod_alias:

RedirectMatch 403 ^/folder/file.php$

Это покажет запрещенную ошибку для /folder/file.php

Амит Верма
источник
1
+1 - это на самом деле очень хорошо, потому что никто даже не может увидеть, какие файлы существуют, если применить 404 ко всей папке, используя регулярное выражение ^folder.
bytecode77
9

Если я правильно понимаю, вы просто хотите запретить доступ к папке включенных?

.Htaccess с директивой DENY FROM ALL, помещенный в папку include, сделает свое дело.

mainegreen
источник
8

Ваш Q состоит из двух частей, решения jeroen и anubhava работают в части I - отказ в доступе к / includes. Анубхава также работает для второй части. Я предпочитаю последнее, потому что используюDOCROOT/.htaccess все равно и это сохраняет весь такой контроль в одном файле.

Однако то, что я хотел обсудить, это понятие «отказ в доступе submit.php». Если вы не хотите использоватьsubmit.php зачем вообще это в DOCROOT? Я подозреваю, что ответ здесь заключается в том, что вы используете его как цель действия в некоторых формах и хотите, чтобы он запускался только при отправке формы, а не напрямую, например, от спам-бота.

Если это так, то вы не можете использовать часть II анубхавы, так как это приведет к провалу формы. Что вы можете сделать здесь: (i) с .htaccessпроверкой, чтобы убедиться, что реферал был вашей собственной страницей индекса:

RewriteCond %{HTTP_REFERRER} !=HTTP://www.domain.com/index.php   [NC]
RewriteRule ^submit\.php$    -                                   [F]

И (ii) в генераторе форм PHP index.php включить некоторые скрытые поля для отметки времени и проверки. Проверка может быть, скажем, первые 10 символов MD5 метки времени и некоторый внутренний секрет. После обработки отправки вы можете (i) проверить, что метка времени и проверка совпадают, и (ii) метка времени находится, скажем, в пределах 15 минут от текущего времени.

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

TerryE
источник
6

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

Satisfy all
Order deny,allow
Deny from all

Я столкнулся с этим, когда верхний каталог определил базовую аутентификацию, включая строку:

Satisfy any

Это мешало моему отказу от всех вступить в силу, потому что пользователи были аутентифицированы.

Кит
источник
1

Вы можете добавить следующую команду в .htaccessфайл

Deny from all
ErrorDocument 403 "nothing is here"

В случае несанкционированного доступа будет отображено сообщение «здесь ничего нет».

Если вы хотите перенаправить с помощью кода ошибки на определенную страницу, вы можете определить команду следующим образом:

ErrorDocument 404 "/errors/404.html"

Он будет перенаправлен на /errors/404.htmlэкран и покажет пользовательскую страницу, которая не найдена.

user1324491
источник