Запретить доступ к определенным типам файлов в определенном каталоге - программирование
Подтвердить что ты не робот

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

Для некоторых приложений пользователи могут загружать свои собственные файлы. Поскольку это могут быть очень большие файлы, им разрешено загружать их через собственный FTP-клиент.

Конечно, я бы не хотел, чтобы они загружали некоторые PHP файлы, с которыми они могли получить доступ ко всем другим файлам на сервере. Один из способов, которым я хочу предотвратить это поведение, - это запретить доступ к определенным типам файлов (например, php, rb, py и т.д.) Только в этих папках.

Я нашел способы запретить доступ к папкам, файлам, файлам в папках, но ничего не касается типов файлов в папках.

Я попытался объединить то, что нашел, например:

<Files ~ "\.inc$">
Order allow,deny
Deny from all
</Files>

меняется на

<Files uploads/ "\.inc$">
Order allow,deny
Deny from all
</Files>

или альтернативные способы

RewriteRule ^(\.php) - [F,L,NC] 

к

RewriteRule ^(uploads/\.php) - [F,L,NC]

Однако я не могу определить, какой синтаксис я должен использовать.

Итак, например, у меня может быть следующий (базовый пример):

/index.php
/uploads/
  hack.php
  hack.rb
  hack.py
  pony.jpg

Я хочу, чтобы hack.php/rb/py был недоступен, но все остальное было доступно. Какой синтаксис я должен использовать?

4b9b3361

Ответ 1

Директива FilesMatch работает только по именам файлов. Он вообще не смотрит на часть пути.

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

Попробуйте следующее:

RewriteRule ^uploads/.*\.(php|rb|py)$ - [F,L,NC]

Вышеуказанное будет блокировать любое имя файла, заканчивающееся на .php или .rb или .py в каталоге /uploads или его подкаталогах. Например, он заблокирует:

  • /uploads/something.php
  • /uploads/something/more.php

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

В то время как приведенное выше отвечает на ваш вопрос, было бы безопаснее разрешать только определенные файлы, а не пытаться блокировать файлы. Часто сервер будет выполнять файлы с расширениями, отличными от тех, которые вы указали.

Вы можете сделать что-то вроде этого:

RewriteCond %{REQUEST_URI} ^/uploads [NC]
RewriteCond %{REQUEST_URI} !\.(jpe?g|png|gif)$ [NC]
RewriteRule .* - [F,L]

С приведенным выше, если URI запроса начинается с /uploads, но не заканчивается одним из указанных расширений, тогда это запрещено. Вы можете изменить расширения на то, что вам подходит. Но таким образом, вы можете разрешать расширения по мере необходимости, а не слишком поздно опоздать, что вы пропустили блокировку.

Это правило (из вашего вопроса)

RewriteRule ^(uploads/\.php) - [F,L,NC]

заблокирует

  • /uploads/.php
  • /uploads/.phpmore

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

Если вы собираетесь использовать правила rewirte, вы можете узнать больше о regexp. Я часто ссылаюсь на www.regular-expressions.info, когда мне нужно что-то искать.

Ответ 2

Вы можете поместить .htaccess в каталог upload. Затем директивы будут применяться к этому каталогу и только к каталогам ниже. См. Как применяются директивы.

Таким образом,.htaccess с FilesMatch может ограничить доступ для файлов, соответствующих *.inc, *.php и т.д., когда он находится в public

<FilesMatch "\.(?:inc|php|py|rb)$">
Order allow,deny
Deny from all
</FilesMatch>

Ответ 3

Вы можете использовать следующее самое простое и одно liner-решение для отказа в доступе к типам файлов certen:

RedirectMatch 403 ^/folder/.+\.(png|gif|js)$

Это приведет к ошибке 403 Access для клиентов, если они попытаются получить доступ к /folder/file.extension.