Отключите все CGI (php, perl, …) для каталога, используя.htaccess

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

Чтобы избежать проблем с безопасностью (например, кто-то загружает вредоносный скрипт php), я в настоящее время изменяю расширение файлов, добавляя .data например, но затем при загрузке файла, они должны вручную удалить .data,

Другим распространенным решением является загрузка файлов в каталог, который не обслуживается Apache, и использование сценария php для управления всеми загрузками путем вызова readfile(),

Я хотел бы просто запретить выполнение любых сценариев (сценарии php, perl, cgi, что бы я ни установил в будущем) в папке загрузки. Этот SO ответ предлагает добавить следующую строку в .htaccess файл в этой папке:

SetHandler default-handler

Однако в моем случае это не имеет никакого эффекта (пример сценария php, который я поместил в эту папку, все еще выполняется). Что я делаю неправильно?

Конфигурация Apache

На машине работает VPS (виртуальный частный сервер) Debian GNU/Linux 6.0.7 (squeeze)и, насколько я помню (я записываю все команды, которые я запускаю на этом сервере, поэтому моя "память" должна быть достаточно точной), я ничего не изменяю в конфигурации apache2, приложение не запускается sudo apt-get install php5и создание файла /etc/apache2/sites-enabled/mysite.com со следующим содержанием:

<VirtualHost *:80>
  ServerAdmin webmaster@localhost
  ServerName  mysite.com
  ServerAlias www.mysite.com

  DocumentRoot /home/me/www/mysite.com/www/
  <Directory />
    Options FollowSymLinks
    AllowOverride All 
  </Directory>
  <Directory /home/me/www/mysite.com/www/>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride All 
    Order allow,deny
    allow from All
  </Directory>

  ErrorLog ${APACHE_LOG_DIR}/error.log

  # Possible values include: debug, info, notice, warn, error, crit,
  # alert, emerg.
  LogLevel warn

  CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

2 ответа

Решение

Поместите это в свой .htaccess:

<Files *>
    # @mivk mentionned in the comments that this may break
    # directory indexes generated by Options +Indexes.
    SetHandler default-handler
</Files>

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

Если вы не уверены, что поведение опции должно измениться в будущем, укажите это в /etc/apache2/sites-enabled/mysite.com

    <Directory /home/me/www/upload/>
            # Important for security, prevents someone from
            # uploading a malicious .htaccess
            AllowOverride None

            SetHandler none
            SetHandler default-handler

            Options -ExecCGI
            php_flag engine off
            RemoveHandler .cgi .php .php3 .php4 .php5 .phtml .pl .py .pyc .pyo
            <Files *>
                    AllowOverride None

                    SetHandler none
                    SetHandler default-handler

                    Options -ExecCGI
                    php_flag engine off
                    RemoveHandler .cgi .php .php3 .php4 .php5 .phtml .pl .py .pyc .pyo
            </Files>
    </Directory>

Если вы не можете изменить конфигурацию apache, поместите файлы в .htaccess со следующей структурой каталогов:

/home/me/www/
          |- myuploadscript.php
          |- protected/
              |- .htaccess
              |- upload/
                  |- Uploaded files go here

Таким образом, никто не сможет перезаписать ваш .../protected/.htaccess файл, так как их загрузки идут в подкаталоге .../protected, не в protected сам.

AFAICT, вы должны быть в безопасности с этим.

Моя установка Godaddy не позволяет мне редактировать файлы httpd.conf, а команда php_flag не работает из-за того, как они реализовали php для меня.

Я смог использовать это в моем .htaccess файл:

SetHandler default-handler
AddType text/plain php

Я поместил это в каталог выше, где мой пользователь FTP имеет доступ, что заставляет все PHP-файлы в этом каталоге, а также все подкаталоги показывать php в виде простого текста.

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

Другие вопросы по тегам