Как безопасно запретить запуск загруженного файла через PHP на любом сервере?

Я заметил, что можно запустить файл через PHP, даже если его расширение не было .php , например файл test.xyz.php.whatever.zyx может быть запущен с PHP, даже если расширение не является .php ! Просто бывает .php. в имени файла, и этого достаточно, чтобы мой Apache запускал PHP-скрипт.

Я попробовал (как кто-то предложил) поместить это в файл .htaccess в этой папке:

 php_flag engine off 

Но это не сработало на моей машине.

Единственные решения, которые я знаю сейчас:

  • Переименуйте в известное расширение файла, которое не запускается через PHP, например .txt .
  • Удалите все точки из имени файла, что делает его неограниченным.

Но я все еще не уверен, как эти решения будут работать на других серверах, чем мой сервер Windows (с Apache).

Есть ли другие решения, которые не нуждаются в именах файлов, которые нужно переименовать?

для загрузки пользователями я предлагаю вам загрузить папку в слой выше корневого пути. В этом случае «Только у вас есть доступ к папке загрузки» (в прямой адресации), и злоумышленник не имеет доступа к каким-либо файлам в этой папке. Таким образом, вы отключите атакующего действие для запуска вредоносного файла

Чтобы быть в полной безопасности, вам нужно сделать несколько вещей:

Установите свою загрузочную директорию над вашей «общедоступной» папкой, делая ее недоступной из браузера. Этот параметр находится в php.ini (файл конфигурации php). Для этого вам нужно будет перезапустить Apache. На большинстве веб-серверов Redhat / Fedora / CentOS это может быть:

 upload_tmp_dir = "/var/tmp/" 

ИЛИ, на моей локальной установке Windows 7 WAMP, она настроена на:

 upload_tmp_dir = "c:/wamp/tmp" 

Отключите скрипты от работы в этом каталоге (c: / wamp / tmp), в .htaccess:

 RemoveHandler .php .phtml .php3 RemoveType .php .phtml .php3 php_flag engine off 

В своем PHP-скрипте загрузите файл, отфильтруйте его на основе mimetype (не расширение файла), измените имя файла и поместите его в защищенную общедоступную папку. Более детально:

  • создать белый список типов файлов, например: только изображения (jpeg, png, gif, bmp). Это можно сделать с помощью mime_content_type () http://php.net/manual/en/function.mime-content-type.php или нового finfo_file () http://us3.php.net/manual/en/function .finfo-file.php
  • выберите новое имя файла, часто лучше использовать случайный хеш MD5 на основе исходного имени файла + salt + timestamp.
  • переместите его в общую папку, например: «c: / wamp / www / project_name / public / uploads»

Предпочтительно использовать структуру MVC, такую ​​как Zend Framework, которая включает фильтрацию типов файлов.

Если вы все это сделаете, вы должны быть в безопасности. Очевидно, что вы никогда не будете на 100% безопаснее, поскольку существуют бесчисленные неявные эксплойты, ориентированные на PHP, MySQL, командную строку и т. Д., Особенно на более старые системы. На более крупных веб-серверах компании (над чем я работаю) они отключают все и выборочно разрешают только то, что требуется для проекта. В системе, такой как WAMP, они позволяют все, чтобы облегчить локальное развитие.

Хорошей практикой для работы над профессиональным проектом является получение учетной записи облачного сервера с помощью Rackspace или Amazon, а также ознакомление с настройками параметров php.ini и httpd.conf, а также лучшие методы защиты PHP. В общем, не доверяйте вводам пользователей, ожидайте, что они будут повреждены / злонамерены / искажены, и в итоге вы будете в безопасности.

Прежде всего, вам нужно понять, что здесь происходит:

 test.xyz.php.whatever.zyx 

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

Поэтому, если вы удалите эту добавленную конфигурацию, Apache не захочет найти там .php – будь то в самом конце или в части сложного файлового расширения.

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

Если у вас есть проблема, чтобы узнать, что это значит, вам нужно опубликовать свою конфигурацию PHP в файле httpd.conf и связанных с ним конфигурационных файлах Apache HTTPD для вашей системы.

Директива, которую кто-то сказал вам для .htaccess :

 php_flag engine off 

работает только в том случае, если вы используете PHP как apache-модуль SAPI.

Вместо php_flag engine off вы можете удалить обработчик для файлов PHP, используя файл .htaccess для одного каталога.

В каталоге, в котором вы отключите PHP, ваш .htaccess должен включать:

 RemoveHandler .php .phtml .php3 .php4 .php5 RemoveType .php .phtml .php3 .php4 .php5 

Однако вы можете уйти от нижнего уровня, в зависимости от того, какие типы AddHandler вы настроили в своей конфигурации Apache по умолчанию, которая в Windows должна быть в C:\Program Files\Apache<version>\conf\httpd.conf

 RemoveHandler .php RemoveType .php 

Вам также необходимо убедиться, что в вашем основном файле конфигурации apache, в котором находится каталог, содержащий файл .htaccess, распространяется действие оператора Directory котором установлен параметр AllowOverride FileInfo . Возможно, вы захотите рассмотреть AllowOverride All если вы будете использовать файлы .htaccess для других целей – см. Документацию Apache для AllowOverride для объяснения различий.

На Apache вы можете отключить все динамические обработчики для каталога, содержащего ненадежные файлы.

 SetHandler default-handler 

это не очень хороший ответ, но надеюсь, что он полезен в некоторых особых случаях …

вы можете использовать mod_rewrite в файле .htaccess следующим образом:

 RewriteRule ^(.+).xyz.php.whatever.zyx$ index.php?openfile=$1 [NC,L] 

и внутри вашего файла index.php :

 $file = secure_this_string($_GET['openfile']); include($file.'.xyz.php.whatever.zyx'); # or some other files 

не забудьте увидеть этот ответ по соображениям безопасности StackOverFlow

и в файле test.xyz.php.whatever.zyx :

 <?php echo 'hello'; 

теперь, если клиент запрашивает файл /test.xyz.php.whatever.zyx, out put должен быть «hello»

Простое регулярное выражение выполнит работу

 <?php $a = strtolower($_FILES["file"]["name"]); $replace = array(".php", ".phtml", ".php3", ".php4", ".php5"); $_FILES["file"]["name"] = str_replace($replace, "", $a); ?> 

Это отлично работает на любом сервере

Следующий .htaccess -code может работать и запрещать доступ к файлам, содержащим « php »:

 <FilesMatch "php"> Deny from all </FilesMatch> 

Я мог бы легко воспроизвести вашу проблему на нашем сервере. Есть способ исправить это, вам нужно отредактировать /etc/mime.types и прокомментировать строки

 #application/x-httpd-php phtml pht php #application/x-httpd-php-source phps #application/x-httpd-php3 php3 #application/x-httpd-php3-preprocessed php3p #application/x-httpd-php4 php4 #application/x-httpd-php5 php5 

Эти строки вызывают что-либо, обрабатываемое именем .php. После того, как вы закомментируете записи в mime.types, mod_php config в файле /etc/apache2/mods-enabled/php5.conf имеет эту запись, которая корректно обрабатывает файлы только ENDING с .php

 <FilesMatch "\.ph(p3?|tml)$"> SetHandler application/x-httpd-php </FilesMatch> 

Что ДЕЙСТВИТЕЛЬНО СКАЧАТЬ , что это конфигурация по умолчанию (Ubuntu 10.04 в нашем случае).


РЕДАКТИРОВАТЬ

В Windows файл mime.types должен находиться в apache_home / conf / mime.types

Лично это является основной причиной того, что я больше не загружаю файлы на веб-сервер ни при каких обстоятельствах. Вместо этого я использую S3 / Amazon SDK для перемещения загруженного временного файла непосредственно в ведро на S3 с частными правами (я использую S3, любой другой CDN будет работать так же хорошо). Если файл нужно просмотреть или просмотреть веб-клиентом, я использую функцию «getter», которая объединяется с SDK для получения файла и отображения его.

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