Я заметил, что можно запустить файл через PHP, даже если его расширение не было .php
, например файл test.xyz.php.whatever.zyx
может быть запущен с PHP, даже если расширение не является .php
! Просто бывает .php.
в имени файла, и этого достаточно, чтобы мой Apache запускал PHP-скрипт.
Я попробовал (как кто-то предложил) поместить это в файл .htaccess
в этой папке:
php_flag engine off
Но это не сработало на моей машине.
Единственные решения, которые я знаю сейчас:
.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 (не расширение файла), измените имя файла и поместите его в защищенную общедоступную папку. Более детально:
Предпочтительно использовать структуру 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), все это очень легко управлять, и все файлы эффективно помещаются на карантин с сервера по умолчанию.