Отключите все 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
например