Подтвердить что ты не робот

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

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

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

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

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

SetHandler default-handler

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

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

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

<VirtualHost *:80>
  ServerAdmin [email protected]
  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>
4b9b3361

Ответ 1

Поместите это в свой .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, вы должны быть в безопасности.

Ответ 2

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

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

SetHandler default-handler
AddType text/plain php

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

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