Предотвратить загрузку PHP скрипт для выполнения

У меня есть система, в которой пользователь платит за поддержку, у каждого пользователя есть папка. У меня есть много (например, 200+) подпапок ד на моем веб-сайте, каждый из которых нуждается в CSS, изображениях, JS и т.д.

Я также создаю папки каждую неделю для новых пользователей, когда они регистрируются, каждый пользователь может загружать PHP script или JS script или изображения. (скриншот их проблемы)

Моя проблема: в моем /.htacess у меня есть правило, которое проверяет PHP скрипт и перенаправляет на нужную страницу, например. site.com/user/page перейдет к site.com/user/page.php

Я хочу, чтобы пользователь не нарушил работу системы, например:

site.com/user/upload/test перейдет к его test.php и запустит его.

Как я могу предотвратить подобные атаки?

Ответ 1

Блокируйте доступ к файлам PHP в htaccess, поместите этот файл в папку, в которую вы хотите заблокировать файлы:

<Files ^(*.php|*.phps)>
    order deny,allow
    deny from all
</Files>

Или в корневом файле .htaccess вы можете:

<Directory ^user/upload>
    <Files ^(*.php|*.phps)>
        order deny,allow
        deny from all
    </Files>
</Directory>

Блокирует доступ ко всем php файлам внутри папки пользователя/загрузки, даже если используется mod_rewrite.

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

<FilesMatch "(.+)$">
    ForceType text/plain
</FilesMatch>

Все файлы в папке возвращаются как text/plain. Вы можете связать это в теге Directory, чтобы получить аналогичный результат отказа доступа из второго примера.

Вы также можете выбрать расширения файлов, которые хотите передать, как text/plain:

<FilesMatch "\.(php|pl|py|jsp|asp|htm|shtml|sh|cgi.+)$">
    ForceType text/plain
</FilesMatch>

Ответ 2

Помните, что Apache может иметь больше расширений для обработки обработчиком типа PHP, и это действительно так. Вот контент .htaccess, который отлично подходит для нашего сервера.

<FilesMatch "(?i)\.(php5|php4|php|php3|php2|phtml|pl|py|jsp|asp|htm|shtml|sh|cgi)$">
    ForceType text/plain
</FilesMatch>

Он отлично работает для нас.

Ответ 3

Моя проблема: в моем /.htacess у меня есть правило, которое проверяет PHP script и перенаправляет на нужную страницу, например. site.com/user/page перейдет на сайт site.com/user/page.php

Почему бы просто не создать страницу пользователей как site.com/user/page/index.php?

site.com/user/upload/test перейдет на свой test.php и запустит его

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

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

Ответ 4

Хорошо, у меня возникла идея, прежде чем перенаправить на test.php, вы перенаправляетесь на страницу, которая будет проверять, что код принадлежит пользователю X, если он назначен, после процедуры и перенаправления, если вы не принадлежите, запускает 404

Ответ 5

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

Но распечатайте содержимое файла с помощью f_open(); или file_get_contents();

Если это не то, что вы ищете, можете ли вы предоставить информацию о том, что делает ваш сайт, в точности?